5

跟进:CUDA:停止所有其他线程

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

比如,如果“坏”发生,除以零。但是我不确定一个线程是否会被零除,是否足以使整个内核崩溃,或者只是那个线程?

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

4

2 回答 2

7

您应该首先阅读这个问题以及 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() 在调试版本中退出并出现错误。目前尚不清楚这是否是您想要的。

于 2012-09-21T02:39:07.427 回答
1

该断言可能会对您有所帮助。您可以在 CUDA C Programming Guide 的 B.15 中找到它。

于 2012-09-21T07:53:41.940 回答