2015-05-27 48 views
0

我有两个关于WRITE/READ操作共享阵列的问题。OpenMP共享阵列加载/存储

1)在我的程序中,我在OpenMP并行化DO LOOP的每次迭代中写入给定共享数组的不同元素。考虑到每次迭代都作用于数组的不同部分,并且没有竞态条件发生,我避免使用CRITICAL。在不同的子程序中,我会在每次迭代中读取不同的元素。我得到的结果应该是正确的,但我只是想知道这是否正常,或者我应该将READ/WRITE部分放在CRITICAL块中。 2)一般而言,我们可以说,如果没有上述两种情况的竞争条件风险,那么CRITICAL或ATOMIC块可以省略?

在此先感谢

提米

回答

0

1)只要你是正确的,而且不同的线程写入到不同的数组元素,那么就没有数据竞争。在直接的方法,这是写(伪)这样的代码

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

,其中每个线程获得一组不同的i值,因此一组不同的阵列元件的写入。

读取不会导致数据竞争。不规范的阅读可能会导致过度活跃的缓存并可能导致性能下降。但不是数据竞赛。

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

+0

谢谢。这正是我的意思。 – Timmy