我已经构建了一些使用OpenACC的C ++代码,并使用PGI编译器对其进行编译,以便在Tesla GPU上使用。
编译成功,没有任何警告。
我运行程序并得到两个错误:
call to cuStreamSynchronize returned error 717: Invalid address space
call to cuMemFreeHost returned error 717: Invalid address space
互联网似乎对此并不了解,除了建议enabling unified memory以便问题在地毯下自动扫除。我不是那种解决方案。
我该如何调试?
由于C ++代码只在CPU上运行,我会启动gdb,进行回溯,然后说:“啊哈!”
但是现在我的代码存在于CPU 和 GPU以及两者之间流动的数据上。我甚至不知道使用什么工具。
后备是开始评论线,直到问题消失,但这似乎也不是最理想的。
答案 0 :(得分:1)
您可以使用" cuda-gdb"调试设备代码或使用" cuda-memcheck"检查内存错误。
虽然我不确定是否会有所帮助。该错误表示设备代码使用来自错误存储空间的地址发出指令。例如,使用带有指令的共享内存指针,该指令需要全局内存指针。
我之前没有看过这个错误,也没有看到任何先前的错误报告,所以只能理解原因。一种可能性是,如果你有一个共享内存变量(" private"子句中的标量或数组,或者" cache"指令),它们从外部循环循环传递到矢量例程。在这种情况下,矢量例程可能正在访问变量,就像它在全局存储器中一样。
最有可能的原因是编译器错误。如果可能,请发送或发送给PGI客户服务(trs@pgroup.com)一个复制示例,我将把它交给我们的编译工程师进行调查。
一旦我更好地了解原因,我也可以尝试让你解决问题。虽然在此期间您可以尝试使用" -ta = tesla:nollvm,keepgpu"进行编译。 " nollvm"将导致编译器生成OpenACC内核的中间CUDA C版本,而不是默认的LLVM设备代码生成器。 " keepgpu"将保留中介" .gpu"你可以检查的文件。
答案 1 :(得分:0)
有一些有用的环境变量可以帮助调试。可以启用任何组合:
export PGI_ACC_TIME=1 #Profile time usage
export PGI_ACC_NOTIFY=1 #Set to values 0-3 where 3 is the most detailed
export PGI_ACC_DEBUG=1 #Extra debugging info