这是我的pthread代码的问题。当我运行以下命令时:
./run 1
./run 2
./run 4
前两个命令(一个线程和两个线程)生成相同的输出。但是有4个线程(第三个命令),我看到不同的输出。
现在我运行以下命令
valgrind --tool=helgrind ./run 1
valgrind --tool=helgrind ./run 2
valgrind --tool=helgrind ./run 4
他们生成相同的输出。但输出值是正确的。
我如何进一步调查?
代码看起来像
int main(int argc,char *argv[])
{
// Barrier initialization
if(pthread_barrier_init(&barr, NULL, threads)) {
printf("Could not create a barrier\n");
return -1;
}
int t;
for(t = 0; t < threads; ++t) {
printf("In main: creating thread %ld\n", t);
if(pthread_create(&td[t], NULL, &foo, (void*)t)) {
printf("Could not create thread %d\n", t);
return -1;
}
}
...
}
void * foo(void *threadid)
{
long tid = (long)threadid;
for ( i = (tid*n/threads)+1; i <= (tid+1)*n/threads; i++ ) {
printf( "Thread %d, i=%d\n", tid, i );
for(largest = i, j = i+1; j <= n; j++) {
if(abs( a[j][i] ) > abs( a[largest][i] ))
largest = j;
}
for(k = i; k <= n+1; k++)
SWAP_DOUBLE( a[largest][k], a[i][k]);
for( j = i+1; j <= n; j++) {
for( k = n+1; k >= i; k--)
a[j][k] = a[j][k]-a[i][k]*a[j][i]/a[i][i];
}
}
int rc = pthread_barrier_wait(&barr);
if(rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD) {
printf("Could not wait on barrier\n");
exit(-1);
}
printf("after barrier\n");
...
}
主循环(在i
中迭代foo()
)除以线程数。假设所有变量都已正确定义,因为正如我所说,1和2线程没有问题。
答案 0 :(得分:0)
我不完全确定发生了什么,因为你没有给出一个完整的可编译程序来进行试验,但很明显每个线程都是从a
的部分读/写它不是分配给它,所以你到处都有竞争条件。您正在交换a
的部分,因此我不确定您是否可以将此算法并行化。