OpenMP 运行时条件 GPU 目标内核执行

时间:2021-03-28 21:51:00

标签: fortran gpu openmp

是否有一种语法允许根据运行时条件的状态在设备 (GPU) 或主机上有条件地执行内核?

这是一个示例 Fortran 代码,它可以根据变量 onGPU 的状态轻松切换设备数据子句

然而,内核似乎只是在条件为假时中止,并且永远不会在主机上执行。这是我正在查看的示例代码。

program test

  implicit none

  integer :: a,b,c
  logical   ::  onGPU

  real, dimension(:,:,:), allocatable :: array

  onGPU = .false.

  allocate(array(1000,1000,1000))
  array=0.e0

  !$omp target enter data if(onGPU) map(to:array)

  !$omp target teams distribute parallel do collapse(3) schedule (static, 1) &
  !$omp& if(onGPU) &
  !$omp& private(a,b,c)
  do a = 1,1000
     do b = 1,1000
        do c = 1,1000
           array(a,b,c) = 1.e0
        end do
     end do
  end do

  !$omp target update if(onGPU) from(array)

write(*,*) sum(array)/size(array)

end program test

上面有我无法理解的非常奇怪的行为。问题是设备内核。从设备内核中删除 if 子句并使用 data 子句会给出预期的行为。我还尝试了 if() 语句在内核中的位置,但没有成功。

我为此使用了 IBM fortran 编译器。感谢观看。

1 个答案:

答案 0 :(得分:1)

与开发人员讨论后,该功能在本文发布时似乎是一个非常新的功能,尚未在大多数编译器中实现。

所以我们耐心等待。

相关问题