0

これがpthreadコードに関する私の問題です。次のコマンドを実行すると:

 ./run 1
 ./run 2
 ./run 4

最初の 2 つのコマンド (1 つのスレッドと 2 つのスレッド) は同じ出力を生成します。ただし、4 つのスレッド (3 番目のコマンド) では、異なる出力が表示されます。

次のコマンドを実行すると

 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 スレッドには問題がないので、すべての変数が適切に定義されていると仮定します。

4

1 に答える 1

0

実験用の完全なコンパイル可能なプログラムを提供していないため、何が起こっているのか完全にはわかりませんが、各スレッドがa割り当てられていないセクションから読み取り/書き込みを行っていることは明らかです。いたるところに競合状態があります。のセクションを交換してaいるため、このアルゴリズムをそのまま並列化できるかどうかはわかりません。

于 2012-10-08T14:38:05.787 に答える