我正在尝试并行化代码以在尖峰神经网络上运行一些模拟。这涉及一个双循环,我在主循环之外放置一个语句'#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的一个值上工作,并且count数组仅取决于i的当前值。如何重写代码以便我可以安全地增加计数?
答案 0 :(得分:1)
您必须将j
声明为私人。您可以通过以下方式明确地执行此操作:
#pragma omp parallel for private(j)
i
隐式私有是工作共享循环的循环变量。 count
隐式共享,因为它在循环之外定义。这两个都是可取的。
但是,我强烈建议始终在本地声明变量,尤其是在使用OpenMP时。这样,隐式私有 / 共享几乎总是正确的,并且它避免了许多微妙的未定义值读取。这通常是一种很好的做法
int count[200];
#pragma omp parallel for
for(int i=0;i<200;i++){
count[i] = 0;
for (int j=0;j<200;j++){
BTW:您的count[i]-j
打印输出可以显示完全任意的值。它访问可能由其他线程同时写入的数据。