我读过这篇文章: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,代码相当很大,有点难读,所以我不会在这里发布...)
答案 0 :(得分:4)
看起来很奇怪。如果您将看到使用OpenMP的大多数代码都不符合要求。你会在我的代码库中看到类似这样的东西,我相信这个说法是虚假的。不幸的是,没有直接引用相关的规范部分,很难找到想到的内容。
我甚至会说像public function ajaxSend(){
if( Request::ajax() ){
return Response::json(['success' => 1]);
}
}
和atomic
部分这样的功能会失去意义,如果它是作者所声称的那样。
如果您没有看到随机的代码,我们就无法说出任何内容,如果您不打算展示它,最好也不要提及它。
答案 1 :(得分:2)
引用文章中的陈述是错误的。
查看文章“The OpenMP Memory Model”,它很好地解释了OpenMP内存模型。
允许每个线程在内存的共享部分上拥有自己的“临时视图”,并且“视图”和“内存”之间的两个方向上的流可能会被延迟(尽管可以通过{强制更新) {1}}来电等)。但在同一视图中没有限制。并且由于每个迭代都保证只由一个线程执行,因此您可以在单次迭代中获得正常行为。因此,保证给定的示例按预期工作。