是否有一种语法允许根据运行时条件的状态在设备 (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 编译器。感谢观看。
答案 0 :(得分:1)
与开发人员讨论后,该功能在本文发布时似乎是一个非常新的功能,尚未在大多数编译器中实现。
所以我们耐心等待。