openmp+fortran程序,双重do循环外面都加并行,结果好像并行了,但是threadid都是0,请问到底并行没有?

!$OMPPARALLELDODOI=1,10!$OMPPARALLELDODOJ=1,10WRITE(*,10)I,J,OMP_GET_THREAD_NUM()10FO... !$OMP PARALLEL DO
DO I=1,10
!$OMP PARALLEL DO
DO J=1,10
WRITE(*,10)I,J,OMP_GET_THREAD_NUM()
10 FORMAT(1X,'I=',I2,'J=',I2,'ID=',I3)
ENDDO
!$OMP END PARALLEL DO
ENDDO
!$OMP END PARALLEL DO
另外双重循环到底怎样并行?
展开
 我来答
把盏饮寂寞
2013-09-25 · TA获得超过405个赞
知道小有建树答主
回答量:166
采纳率:0%
帮助的人:83.4万
展开全部
  • OpenMP的嵌套并行在默认情况下为false。

假如有第一层(外层)、第二层(内层)两层并行,默认情况下,第一层并行制导语句会创建线程组,将外层循环实现线程并行化,但第二层制导语句不会创建多个线程,而是将其所包含的代码会在外层线程组中的每一个线程里串行执行。


如外层的0号线程执行到内层并行制导语句处,在0号线程内不会再创建多个线程的线程组,而是以一个线程串行执行,即0号线程内的主线程,其线程号也为0;

同理,如外层的1号线程执行到内层并行制导语句处,在1号线程内不会再创建多个线程的线程组,而是以一个线程串行执行,即1号线程内的主线程,其线程号也为0;


你把获取线程号的库函数OMP_GET_THREAD_NUM()放在内层循环,这样默认情况下其获得的线程号永远都是0。


  • 实现并行嵌套的方法

若要并行区域A内可以再嵌套并行区域B,需要在并行区域A外面激活并行嵌套,如下:

OMP_set_nested(1)

!$OMP PARALLEL DO
     DO I=1,10
!$OMP PARALLEL DO
        DO J=1,10
     WRITE(*,10)I,J,OMP_GET_THREAD_NUM()
10    FORMAT(1X,'I=',I2,'J=',I2,'ID=',I3)
        ENDDO
!$OMP END PARALLEL DO
     ENDDO
!$OMP END PARALLEL DO

heresy_me
2013-09-24 · TA获得超过1719个赞
知道小有建树答主
回答量:1708
采纳率:42%
帮助的人:304万
展开全部
你没有设置线程数?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式