如果发生"坏情况",我正在寻找退出内核的方法.编程手册说NVCC不支持异常处理.我想知道是否有用户定义的cuda-error-code.换句话说,如果发生"坏",则以此用户错误代码终止.我怀疑是否有一个,所以我的另一个想法是造成一个.
如果"坏"发生,则除以零.但我不确定一个线程是否进行零除,是否足以使整个内核崩溃,或只是崩溃?
有没有更好的方法来终止内核?
你应该首先阅读这个问题以及harrism和tera的答案(昨天问到/回答).
你可能会想要使用类似的东西
if (there_is_an_error) {
*status = MY_ERROR_CODE; // store to device pointer
__threadfence(); // ensure store issued before trap
asm("trap;"); // kill kernel with error
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这并不能完全满足你"优雅"的条件.陷阱导致内核退出并运行时报告cudaErrorUnknown.但由于内核执行是异步的,您需要同步您的流/设备以捕获此错误,这意味着在每次内核调用之后进行同步,除非您对错误有不准确的错误(即您可能无法捕获错误代码调用后续的CUDA API调用).
但这只是CUDA中内核错误处理的方式,编写良好的代码应该在调试版本中进行同步以检查内核错误,并在发布版本中解决不精确的错误消息.不幸的是,我认为没有更优雅的方式.
编辑:在Compute功能2.0及更高版本上,您可以使用assert()退出调试版本中的错误.目前还不清楚这是否是你想要的.