我理解网络上关于atomicC++ 中 OpenMP 指令的解释的方式是它们适用于特定的内存位置,由某个变量(或其指针?)指定。因此,当我在并行for循环内的不同代码行上访问此位置时,我可以保护所有这些代码还是atomic只保护一行代码而不查看访问同一内存位置的其他可能行?
例如,考虑以下代码:
int N = 10000; // just some big number
float a[N]; // a big array
#pragma omp parallel for
for(int i = 1; i < N-1; i++) {
#pragma omp atomic
a[i-1] += 0.5f;
#pragma omp atomic
a[i] += 1.0f;
#pragma omp atomic
a[i+1] += 0.5f;
}
在每次循环迭代中,在三个点处访问同一个数组,索引处i、i减一i和加一。但是,在不同的线程中,该i-1行的计算结果可能与 the iori+1行相同。例如,在线程 1i==1和线程 2i==3中,第三个(在线程 1 中)和第一个(在线程 2 中)数组访问行将访问相同的数组元素,可能同时访问。
atomic如果它们碰巧访问相同的内存位置,它们会保护这些不同的行吗?还是它只适用于一行,并且唯一的解决方案是将所有三个访问合并到一行中(例如,通过将i-1,i和i+1放在第二个数组中并制作第二个for循环来循环它们)?