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端则直接打印即可

posted @ 2022-12-11 22:38  yukina~  阅读(154)  评论(0编辑  收藏  举报