Fortran OpenMP代码创建线程但是循环不并行运行

时间:2017-05-22 17:27:30

标签: parallel-processing fortran openmp gfortran

我已经使用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)语句来获取另外两个并行化(jk),这是正确的吗?

输出结果如下

 Hello           1
 Hello           4
 Hello           5
 Hello           0
 Hello           3
 Hello           2

建议创建6个线程(根据请求),但是以下循环是串联运行的,为什么? 我试过:使用omp parallel do构造代替;删除所有子句,使变量根据默认值共享/私有。

我会非常感谢任何能给我一些关于我哪里出错的指示。

0 个答案:

没有答案