为什么 OpenACC 帮派级循环不起作用

问题描述

代码

integer :: g_i,w_i

  !$acc parallel num_gangs(3) num_workers(2) vector_length(1)
  !$acc loop independent gang
  do g_i = 1,3
    !$acc loop independent worker
    do w_i = 1,2
      print *,g_i,w_i
    end do
  enddo
  !$acc end parallel

打印:

        1            1
        1            2
        1            1
        1            2
        1            1
        1            2

我不明白为什么 g_i 上的帮派级循环不起作用。

pgfortran 编译器报告:

171,Generating Tesla code
    173,!$acc loop gang(3) ! blockidx%x
    175,!$acc loop worker(2) ! threadidx%y
175,Loop is parallelizable

解决方法

您使用的是什么编译器版本、命令行选项和架构?

我试过你的例子,但它似乎给出了预期的答案。我在面向 V100 的 Linux x86_64 上使用 NVHPC SDK 20.11。

% cat test.f90


program foo

   integer :: g_i,w_i

  !$acc parallel num_gangs(3) num_workers(2) vector_length(1)
  !$acc loop independent gang
  do g_i = 1,3
    !$acc loop independent worker
    do w_i = 1,2
      print *,g_i,w_i
    end do
  enddo
  !$acc end parallel

end program foo
% pgfortran test.f90 -acc -V20.11 -fast -Minfo=accel ; a.out
foo:
      7,Generating Tesla code
          9,!$acc loop gang(3) ! blockidx%x
         11,!$acc loop worker(2) ! threadidx%y
     11,Loop is parallelizable
            1            1
            1            2
            2            1
            2            2
            3            1
            3            2