Cuda 优雅地崩溃内核

Cuda 优雅地崩溃内核,cuda,Cuda,A后续行动: 我正在寻找一种在出现“坏情况”时退出内核的方法。 程序手册说NVCC不支持异常处理。我想知道是否有用户定义的cuda错误代码。换句话说,如果发生“坏”情况,则使用此用户错误代码终止。我怀疑有一个,所以我的另一个想法是引起一个 比如,如果“坏”发生,除以零。但是我不确定一个线程是否会被零除,这是否足以使整个内核崩溃,还是仅仅使该线程崩溃 是否有更好的方法终止内核?您应该首先阅读(昨天询问/回答) 您可能会尝试使用以下内容 if (there_is_an_error) { *sta

A后续行动:

我正在寻找一种在出现“坏情况”时退出内核的方法。 程序手册说NVCC不支持异常处理。我想知道是否有用户定义的cuda错误代码。换句话说,如果发生“坏”情况,则使用此用户错误代码终止。我怀疑有一个,所以我的另一个想法是引起一个

比如,如果“坏”发生,除以零。但是我不确定一个线程是否会被零除,这是否足以使整个内核崩溃,还是仅仅使该线程崩溃

是否有更好的方法终止内核?

您应该首先阅读(昨天询问/回答)

您可能会尝试使用以下内容

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中内核错误处理的方式,编写良好的代码应该在调试版本中同步以检查内核错误,并在发布版本中处理不精确的错误消息。不幸的是,我认为没有比这更优雅的方式了


编辑:在Compute capability 2.0及更高版本上,您可以使用assert()在调试版本中出现错误时退出。不过,还不清楚这是否是您想要的。

这个断言可能会对您有所帮助。您可以在CUDA C编程指南的B.15中找到它。

如果您的主要用途是调试,CUDA在费米和开普勒上有assert支持。它会终止您的上下文,但在退出时会给出一条有用的断言消息,或者在您在调试器中运行应用程序时将您放入断言失败的代码中