我正在尝试使用OpenMp将这个pascal三角形程序调整为一个并行程序。我使用for
指令并行化printPas
函数for循环,并将条件语句放在临界区内,以便一次只能打印一个线程,但似乎我仍在进行数据竞赛,因为我的输出确实不一致。
#include <stdio.h>
#ifndef N
#define N 2
#endif
unsigned int t1[2*N+1], t2[2*N+1];
unsigned int *e=t1, *r=t2;
int l = 0;
//the problem is here in this function
void printPas() {
#pragma omp parallel for private(l)
for (l=0; l<2*N+1; l++) {
#pragma omp critical
if (e[l]==0)
printf(" ");
else
printf("%6u", e[l]);
}
printf("\n");
}
void update() {
r[0] = e[1];
#pragma omp parallel for
for (int u=1; u<2*N; u++)
r[u] = e[u-1]+e[u+1];
r[2*N] = e[2*N-1];
unsigned int *tmp = e; e=r; r=tmp;
}
int main() {
e[N] = 1;
for (int i=0; i<N; i++) {
printPas();
update();
}
printPas();
}
最佳答案
你的关键部分导致打印按顺序运行。因此,代码使用“critical”的时间比不尝试将其并行化要长。
使用不同的线程来打印,您不知道哪个线程将首先访问关键部分。因此,for循环将不会按您希望的顺序执行。
我建议要么删除parallel指令(“#pragma omp parallel for private(l)”,要么删除“critical”,并接受每次打印的顺序都不同。
关于c - 尽管有关键部分,但对输出进行了重新排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53111292/