1

私は並列プログラミングの初心者で、pThreads を使用してアプリケーションを並列化しようとしています。3D 配列を参照し、いくつかのことを計算し、結果を別の 3D 配列に格納する関数があります。この関数は、2 つの for ループを使用して配列を通過します (3 番目の次元は 2 です)。

i私の考えは、異なるスレッド間で周囲の for ループを (インデックスを使用して) 共有することです。並列化したい関数は次のとおりです。

#define MAX_X 100
#define MAX_Y 100

void serialFunction(float v1[MAX_X][MAX_Y][2], float v2[MAX_X][MAX_Y][2]) {
     int i,j;
     for(i=0;i<MAX_X;i++) {
         for(j=0;j<MAX_Y;j++) {
            v2[i][j][0] = 2*v1[i][j][1];
            v2[i][j][1] = -3*v1[i][j][0];
         }
     }
}

私はそれらの変更を加えようとしました:

struct thread_data {
  int start;
  int end;
  float ***v1;
  float ***v2;
};


void serialFunction(float v1[MAX_X][MAX_Y][2], float v2[MAX_X][MAX_Y][2]) {
   int t;
   pthread_t threads[NB_CPUS];
   int startBoundaries[NB_CPUS], endBoundaries[NB_CPUS];
   struct thread_data data[NB_CPUS];
   computeBoundaries(startBoundaries, endBoundaries);
   for(t=0;t<NB_CPUS;t++) {
      data[t].start = startBoundaries[t];
      data[t].end = endBoundaries[t];
      data[t].v1 = (float***)v1;
      data[t].v2 = (float***)v2;
      pthread_create(&threads[t], NULL, threadedFunction, (void*)&data[t]);
   }
}



void *threadedFunction(void *threadArg) {
   struct thread_data *data = (struct thread_data*)threadArg;
   float ***v1 = data->v1;
   float ***v2 = data->v2;
   int i,j;

   for(i=data->start;i<data->end;i++) {
      for(j=0;j<PIC_Y;j++) {
         v2[i][j][0] = 2*v1[i][j][1];
         v2[i][j][1] = -3*v1[i][j][0];
   }
}

threadedFunction問題は、コードを実行すると、 の要素にアクセスしようとするたびにセグメンテーション違反が発生することですv1。割り当てられないかのように動作しますv1が、その理由がわかりません。これserialFunctionは、 が最後に達していなくても発生します。

制約は、署名を変更できないことserialFunctionと、pThreads を使用する必要があることです。

誰かが私が間違っていることを説明できますか?

前もって感謝します!

4

1 に答える 1