我是并行编程的新手,我正在尝试使用pThreads并行化应用程序。我有一个功能,可以浏览3D数组,计算一些东西并将结果存储到另一个3D数组中。该函数通过两个for循环遍历数组(第三个维度为2)。
我的想法是在不同的线程之间共享周围的for循环(使用i
索引)。这是我要并行化的函数:
#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。
任何人都可以解释我的错误吗?
提前谢谢!
答案 0 :(得分:0)
传递给线程的数据是为函数serialFunction()
创建的本地/自动数据。您将指向此数据的指针作为参数传递给线程函数。当函数退出时,不保证数据存在。请注意,代码中没有任何内容可以阻止serialFunction()
在 之前退出 ,在线程函数threadedFunction()
中访问数据。如果serialFunction()
在通过threadedFunction()
中的指针访问数据之前退出,则会得到未定义的行为以及您现在遇到的情况。
解决方案是:
serialFunction()
或pthread_join