首页 > 解决方案 > OpenMP 运行时条件 GPU 目标内核执行

问题描述

是否有一种语法允许根据运行时条件的状态在设备 (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 编译器。谢谢参观。

标签: fortrangpuopenmp

解决方案


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

所以我们耐心等待。


推荐阅读