如果发生“不良情况”,我正在寻找一种退出内核的方法。prog 手册说 NVCC 不支持异常处理。我想知道是否有用户定义的 cuda-error-code。换句话说,如果发生“错误”,则使用此用户错误代码终止。我怀疑有一个,所以我的另一个想法是引起一个。
比如,如果“坏”发生,除以零。但是我不确定一个线程是否会被零除,是否足以使整个内核崩溃,或者只是那个线程?
是否有更好的方法来终止内核?
如果发生“不良情况”,我正在寻找一种退出内核的方法。prog 手册说 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
}
在我看来,这并不完全满足您“优雅”的条件。陷阱导致内核退出并且运行时报告cudaErrorUnknown
。但是由于内核执行是异步的,您需要同步您的流/设备以捕获此错误,这意味着在每次内核调用之后进行同步,除非您可以接受不精确的错误(即您可能无法捕获错误代码,直到对后续 CUDA API 调用的调用)。
但这只是 CUDA 中内核错误处理的方式,编写良好的代码应该在调试版本中同步以检查内核错误,并在发布版本中解决不精确的错误消息。不幸的是,我认为没有比这更优雅的方式了。
编辑:在计算能力 2.0 及更高版本上,您可以使用 assert() 在调试版本中退出并出现错误。目前尚不清楚这是否是您想要的。
该断言可能会对您有所帮助。您可以在 CUDA C Programming Guide 的 B.15 中找到它。