我正在尝试并行化代码以在尖峰神经元网络上运行一些模拟。这涉及一个双循环,我在主循环外放置了一条语句“#pragma omp parallel for”。这是代码:
int main(void){
int i,j,count[200];
#pragma omp parallel for
for(i=0;i<200;i++){
count[i] = 0;
for (j=0;j<200;j++){
if (j!=i){
count[i]++;
printf("i: %d j: %d count[i]:%d, count[i]-j:%d\n",i,j,count[i], count[i]-j);
}
}
}
return 0;
}
看结果,count[i] 的一些值超过了 200,即使循环只从 1 到 200。count[i]-j 可以是 0,1 或 -1,但是值差异很大,甚至认为每个线程都会处理 i 的一个值,而计数数组仅取决于 i 的当前值。如何重写代码以便我可以安全地递增计数?
最佳答案
您必须将j
声明为private。您可以通过以下方式明确地这样做:
#pragma omp parallel for private(j)
i
是隐式的 private 作为工作共享循环的循环变量。 count
是隐式共享 因为它是在循环之外定义的。这两者在这里都是可取的。
但是,我强烈建议始终尽可能在本地声明变量,尤其是在使用 OpenMP 时。这样隐式的 private/shared 几乎总是正确的,并且它避免了许多微妙的未定义值读取。这通常是好的做法
int count[200];
#pragma omp parallel for
for(int i=0;i<200;i++){
count[i] = 0;
for (int j=0;j<200;j++){
顺便说一句:count[i]-j
的打印输出可以显示完全任意的值。它访问可能由其他线程同时写入的数据。
关于c - 带有 pragma omp parallel for 的嵌套循环,困惑起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43411142/