并行变量是否确保循环更新?

时间:2015-07-03 20:21:20

标签: loops fortran openmp

我读过这篇文章:Parallel Programming in Fortran 95 using OpenMP 在第11页和第12页上读到的内容:

real(8) :: A(1000), B(1000) 
! $OMP PARALLEL DO
do i = 1, 1000 
   B(i) = 10 * i 
   A(i) = A(i) + B(i) 
enddo
! $OMP END PARALLEL DO

可能无效,因为在B之前无法确保矩阵! $OMP END (PARALLEL) DO的值。对我来说这是至关重要的。我有一些循环,有许多语句依赖于do循环中的先前语句,我认为这很自然。我得到B(j)在迭代i中无法确保i/=j但是在同一次迭代中我认为它是给定的。我纠正还是误解了?如果是这样的话,是否有命令确保至少在迭代中为下一个之前的每个语句更新变量值?

我尝试了一些似乎正常工作的简单循环,就好像它是串行代码一样,但我有一些其他代码似乎有点随机:使用/ O3而不是/ O0,代码相当很大,有点难读,所以我不会在这里发布...)

2 个答案:

答案 0 :(得分:4)

看起来很奇怪。如果您将看到使用OpenMP的大多数代码都不符合要求。你会在我的代码库中看到类似这样的东西,我相信这个说法是虚假的。不幸的是,没有直接引用相关的规范部分,很难找到想到的内容。

我甚至会说像public function ajaxSend(){ if( Request::ajax() ){ return Response::json(['success' => 1]); } } atomic部分这样的功能会失去意义,如果它是作者所声称的那样。

如果您没有看到随机的代码,我们就无法说出任何内容,如果您不打算展示它,最好也不要提及它。

答案 1 :(得分:2)

引用文章中的陈述是错误的

查看文章“The OpenMP Memory Model”,它很好地解释了OpenMP内存模型。

允许每个线程在内存的共享部分上拥有自己的“临时视图”,并且“视图”和“内存”之间的两个方向上的流可能会被延迟(尽管可以通过{强制更新) {1}}来电等)。但在同一视图中没有限制。并且由于每个迭代都保证只由一个线程执行,因此您可以在单次迭代中获得正常行为。因此,保证给定的示例按预期工作。