The*_*ngs 3 parallel-processing fortran openmp
好的,我希望以前没有问过这个问题,因为在搜索中找到这个有点棘手。
我已经查看了 F95 手册,但仍然发现这很模糊:
For the simple case of:
DO i=0,99
<some functionality>
END DO
Run Code Online (Sandbox Code Playgroud)
我试图弄清楚之间有什么区别:
!$OMP DO PRIVATE(i)
DO i=0,99
<some functionality>
END DO
!$OMP END DO
Run Code Online (Sandbox Code Playgroud)
和:
!$OMP PARALLEL DO PRIVATE(i)
DO i=0,99
<some functionality>
END DO
!$OMP PARALLEL END DO
Run Code Online (Sandbox Code Playgroud)
(只是为了指出不同之处:第一个有 OMP DO 但没有 PARALLEL 指令。第二个只是添加了 PARALLEL 指令)
谢谢!
该!$OMP DO PRIVATE(i)指示编译器如何划分线程之间的工作,但不启动任何线程。仅当它(甚至间接地)在一个$OMP PARALLEL区域内时,它才会进行任何工作共享,否则它不会做任何事情。
!$OMP PARALLEL DO PRIVATE(i)
!$OMP END PARALLEL DO
Run Code Online (Sandbox Code Playgroud)
和
!$OMP PARALLELPRIVATE(i)
!$OMP DO
!$OMP END DO
!$OMP END PARALLEL
Run Code Online (Sandbox Code Playgroud)
所以它既启动了线程,又分配了它们之间的工作。
如果你刚刚
!$OMP PARALLEL PRIVATE(i)
!$OMP END PARALLEL
Run Code Online (Sandbox Code Playgroud)
所有线程都将在并行区域内完成所有工作。
如果在并行区域之外遇到 OpenMPdo指令,它将由一个线程串行执行——它的行为就像根本没有并行化一样。当然,那是因为事实并非如此。
第一个片段没有并行化,第二个片段是并行化的。
我不确定F95 手册是什么意思,也不知道为什么要在那里查找有关 OpenMP 的信息。