我理解网络上关于atomic
C++ 中 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 i
ori+1
行相同。例如,在线程 1i==1
和线程 2i==3
中,第三个(在线程 1 中)和第一个(在线程 2 中)数组访问行将访问相同的数组元素,可能同时访问。
atomic
如果它们碰巧访问相同的内存位置,它们会保护这些不同的行吗?还是它只适用于一行,并且唯一的解决方案是将所有三个访问合并到一行中(例如,通过将i-1
,i
和i+1
放在第二个数组中并制作第二个for
循环来循环它们)?