Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing 不使用$OMP DO的OpenMP并行循环_Parallel Processing_Fortran_Openmp - Fatal编程技术网

Parallel processing 不使用$OMP DO的OpenMP并行循环

Parallel processing 不使用$OMP DO的OpenMP并行循环,parallel-processing,fortran,openmp,Parallel Processing,Fortran,Openmp,我在看一个使用FORTRAN版本OPENMP的程序。在那里我遇到了一个相当奇怪的构造。为了使“do”循环并行,使用了以下构造 count = 0 !$OMP PARALLEL do if (count > N ) exit !$OMP CRITICAL count = count + 1 !$OMP END CRITICAL call WORK ! do some work here

我在看一个使用FORTRAN版本OPENMP的程序。在那里我遇到了一个相当奇怪的构造。为了使“do”循环并行,使用了以下构造

count = 0
!$OMP PARALLEL     
    do
      if (count > N ) exit
        !$OMP CRITICAL
           count = count + 1
        !$OMP END CRITICAL

        call WORK ! do some work here
     end do
 !$OMP END PARALLEL
我不确定上面的代码是否真的使do循环并行。我知道这样做的标准方法是使用以下工作共享结构

!$OMP PARALLEL     
!$OMP DO
   do count = 1,N
        call WORK ! do some work here
     end do
!$OMP ENDDO
!$OMP END PARALLEL
通过实现标准的工作共享结构,我已经测试了这两种可能性,并且在使用它时观察到了一些加速。我可以想象,
$OMP CRITICAL
结构可能会成为一个瓶颈,导致一些速度减慢。我认为,如果线程以不同的速度执行,那么使用非标准的工作共享方法可能是有益的。然而,我并不确定我的想法有多准确

先谢谢你


Alex

如果
$如果不使用omp do
,则每个线程都会执行与其他线程相同的操作。
omp do
指令用于在线程之间划分循环的索引空间。这些线程不做相同的工作,而是运行编号循环的不同迭代。在您的情况下,这里没有索引,因此没有要划分的内容,所有线程都将运行相同的代码

对于仅更新计数,可以使用omp原子,但如果
工作
需要足够长的时间来计算,则可以忽略不计。我担心在原始代码的条件下读取计数也有问题

count = 0
!$OMP PARALLEL     
    do
      !$OMP ATOMIC READ
      count2 = count
      if (count2 > N ) exit
        !$OMP ATOMIC UPDATE
           count = count + 1

        call WORK ! do some work here
     end do
 !$OMP END PARALLEL

这里的意图是调用
WORK
N次,并并行执行单个调用。可能有更优雅的方法来实现这一点。

您的想法是正确的,原始代码的作用相当于:

!$OMP PARALLEL DO SCHEDULE(DYNAMIC) 
do count = 0,N
  call WORK ! do some work here
end do
!$OMP END PARALLEL DO

基本上,它以一种非常笨拙和低效的方式实现动态循环调度。如果
呼叫工作
花费的时间总是相同的,即不存在导致工作不平衡的条件,则
计划(动态)
子句可以替换为
计划(静态)
以提高性能。

感谢您的回复。很高兴我谦逊的假设得到证实。我怀疑这是软肥皂。嗨,谢谢你的回复。事实证明,我最初的假设确实是正确的。