CUDA Fortran错误信息获取
CUDA Fortran 错误信息获取
说明
本段摘自《GPU并行算法--N-S方程高性能计算》(白智勇 李志辉 著) chapter2,section4
显示错误信息
CUDA Fortran提供的GPU设备操作库函数基本都提供了判定调用是否成功的返回参数,帮助程序员定位、分析错误产生的原因。比如ierr=cudaGetDeviceCount(nDevices)
语句中,返回值ierr为0时表示函数调用成功,如果返回非0值则表示函数调用过程中出现了错误,返回值等于错误信息ID值。
但只是输出错误信息ID显然无助于程序员了解错误原因,CUDA Fortran提供了通过错误信息ID获取错误信息的库调用:cudaGetErrorString,其函数接口为:
function cudaGetErrorString(errcode)
integer,intent(in) :: errcode
character*(*) :: cudaGetErrorString
调用后返回错误信息ID为errcode的错误信息文本,打印这个文本可以帮助程序员定位、分析错误原因。因而,正式的软件中调用有错误信息ID返回值的库函数应如下书写:
istat=cudaGetDeviceCount(nDevices)
if(istat/=0) then
print *,trim(cudaGetErrorString(istat))
end if
查询最近错误
除了cudaGetErrorString这种即时错误信息显示,CUDA Fortran还提供了查询最近错误信息的手段。
CPU
适用于CPU代码的最近错误信息查询:cudaGetLastError
函数接口为:
integer function cudaGetLastError()
调用后返回CPU进程/线程最近发生的错误信息ID,无错误则返回0。
GPU
适用于GPU代码的最近错误信息查询:cudaPeekAtLastError
函数接口为:
integer function cudaPeekAtLastError()
调用后返回最近发生的CUDA运行时错误信息ID,无错误则返回0。
需要注意的是核函数内无法打印字符串,因此需要将错误信号ID返回到CPU,然后由CPU进行打印:
attributes(global) subroutine test(error)
implicit none
integer error
...
error=cudapeekatlasterror()
...
end subroutine test
program main
use cudafor
implicit none
integer error
integer,device :: error_d
integer ierr
call test<<<1,1>>>(error_d)
ierr=cudathreadsynchronize()
error=error_d
print *,trim(cudageterrorstring(error))
...
end program main
CPU端则直接打印即可