openmp+fortran程序,双重do循环外面都加并行,结果好像并行了,但是threadid都是0,请问到底并行没有?
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
另外双重循环到底怎样并行? 展开
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