好的,我希望以前没有问过这个,因为在搜索中找到它有点棘手。
我查看了F95手册,但仍然发现这个含糊不清:
For the simple case of:
DO i=0,99
<some functionality>
END DO
我试图找出它们之间的区别:
!$OMP DO PRIVATE(i)
DO i=0,99
<some functionality>
END DO
!$OMP END DO
和
!$OMP PARALLEL DO PRIVATE(i)
DO i=0,99
<some functionality>
END DO
!$OMP PARALLEL END DO
(只是指出区别:第一个有OMP DO但没有PARALLEL指令AT ALL。第二个只添加了PARALLEL指令)
谢谢!
答案 0 :(得分:3)
如果在并行区域外遇到OpenMP do
指令,则它由一个线程串行执行 - 它的行为就像它根本没有并行化一样。当然,这是因为它不是。
你的第一个片段没有并行化,第二个是。
我不确定 F95手册的含义,也不知道为什么要查看有关OpenMP的信息。
答案 1 :(得分:2)
!$OMP DO PRIVATE(i)
指示编译器如何划分线程之间的工作,但不启动任何线程。它只会在$OMP PARALLEL
区域内(甚至是间接地)进行任何工作共享,否则它将不会做任何事情。
!$OMP PARALLEL DO PRIVATE(i)
!$OMP END PARALLEL DO
与
相同!$OMP PARALLELPRIVATE(i)
!$OMP DO
!$OMP END DO
!$OMP END PARALLEL
所以它既启动线程又分配他们的工作。
如果你刚刚
!$OMP PARALLEL PRIVATE(i)
!$OMP END PARALLEL
所有线程都会在并行区域内完成所有工作。