我是并行编程的新手,我正在尝试使用 pThreads 并行化应用程序。我有一个函数可以浏览 3D 数组,计算一些东西并将结果存储到另一个 3D 数组中。该函数使用两个 for 循环遍历数组(第三维是 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。
谁能解释我做错了什么?
先感谢您!