OpenMP共享阵列加载/存储

时间:2015-05-27 15:45:07

标签: memory openmp

我对共享阵列上的WRITE / READ操作有两个问题。

1)在我的程序中,我在OpenMP并行化DO LOOP的每次迭代中编写给定共享数组的不同元素。鉴于每次迭代都作用于数组的不同部分并且没有出现竞争条件,我避免使用CRITICAL。在不同的子程序中,我在每次迭代时都阅读不同的元素。我得到的结果应该是正确的,但我只是想知道这是否正常,或者我应该将READ / WRITE部分包含在CRITICAL块中。

2)一般来说,如果没有上述两种情况下的竞争条件风险,可以省略CRITICAL或ATOMIC块吗?

提前致谢

蒂姆

1 个答案:

答案 0 :(得分:0)

1)只要你是对的,并且不同的线程写入不同的数组元素,那么就没有数据竞争。直截了当的方法是编写像这样的(伪)代码

!$omp parallel do
do i = 1, many
    array(i) = something ...
...

其中每个线程获取一组不同的i值,因此要写入一组不同的数组元素。

阅读不会导致数据争用。不严格的阅读可能会导致过度活跃的缓存,并可能导致性能不佳。但不是数据竞赛。

2)是的,一般来说,如果没有数据竞赛,您可以避免使用atomiccritical阻止。