我已经使用gfortran(-fopenmp
标志集)编译了以下代码,但是对于我的生活来说无法解决为什么do循环不能并行运行。我已经检查过线程是否已创建,但代码依次运行。 (检查CPU负载,显然没有时间改进。)
use omp_lib
declarations and do some stuff here
call OMP_SET_NUM_THREADS(6)
!$OMP PARALLEL default(none) shared(nx,ny,nz,nb,some more variables) private(i,j,k,l)
print*, 'Hello', omp_get_thread_num()
!$OMP DO collapse(3)
do i=1,nx+1,1
do j=1,ny+1,1
do k=1,nz+1,1
do some stuff...
end do
end do
end do
!$OMP END DO
!$OMP BARRIER
!$OMP DO collapse(3)
do i=1,nx+1,1
do j=1,ny+1,1
do k=1,nz+1,1
grid(7,i,j,k) = 0.
grid(4:6,i,j,k) = 0.
do l=1,nb,1
do some stuff
end do
do some stuff
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
我希望最内层的l循环在每个案例的单个线程中运行。据我所知,!$OMP DO
构造只在声明(i
循环)之后立即并行化do循环,因此为什么我需要collapse(3)
语句来获取另外两个并行化(j
和k
),这是正确的吗?
输出结果如下
Hello 1
Hello 4
Hello 5
Hello 0
Hello 3
Hello 2
建议创建6个线程(根据请求),但是以下循环是串联运行的,为什么? 我试过:使用omp parallel do构造代替;删除所有子句,使变量根据默认值共享/私有。
我会非常感谢任何能给我一些关于我哪里出错的指示。