gpt4 book ai didi

c - 尽管有临界区,但重新排序输出

转载 作者:太空宇宙 更新时间:2023-11-04 01:46:23 26 4
gpt4 key购买 nike

我正在尝试使这个 Pascal 三角程序适应使用 OpenMp 的并行程序。我使用 for 指令并行化 printPas 循环函数,并将条件语句放在临界区内,这样一次只能打印一个线程,但看起来就像我仍在进行数据竞争一样,因为我的输出确实不一致。

#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();
}

最佳答案

您的关键部分导致打印按顺序运行。因此,与您不尝试并行化代码相比,使用“关键”代码花费的时间更长。

使用不同的线程打印,你不知道哪个先访问临界区。因此,for 循环不会按照您希望的顺序执行。

我建议要么删除并行指令(“#pragma omp parallel for private(l)”),要么删除“关键”并接受打印每次都会以不同的顺序出现。

关于c - 尽管有临界区,但重新排序输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53111292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com