私は並列プログラミングの初心者で、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 を使用する必要があることです。
誰かが私が間違っていることを説明できますか?
前もって感謝します!