21

CUDA内核代码中断言的等效技术是什么?

CUDA 内核代码似乎没有断言。我想要一种在内核代码中轻松捕捉程序员错误的方法。一种机制,我可以设置需要为真的条件,并且当条件为假并显示错误消息时内核应该退出。

4

3 回答 3

6

对于 cc 2.x 或更高版本的设备,可以在内核中使用断言, ,这样一旦调用主机同步函数,线程就会向 stderr 发送消息。void assert(int expression)expression == 0

对于其他情况或无法使用断言(例如在 MacOS 上),您将无法从内核向主机返回错误消息或错误代码。

相反,我会设置一个错误状态并从主机检查它。使用设备全局内存或(更好的)映射主机内存来存储错误状态,作为参数传递给每个内核调用。在内核中使用 if 语句,如果语句失败,则设置错误代码并返回。您将能够在内核调用之后从主机检查错误代码,但请记住,在内核启动后,您将在检查错误代码之前同步主机和设备。我想这对于开发来说会很好,但对于生产来说就不那么好了。

至于直接从设备打印错误消息

  • 在 1.x、2.x 和 3.0 卡中,您可以使用仿真模式打印错误消息。
  • 在 3.1 forward(在 fermi 上)中,显然您可以在内核中使用 printf 来打印错误消息。似乎它并不总是立即起作用,例如http://forums.nvidia.com/index.php?showtopic=182448
于 2011-02-25T07:13:32.923 回答
4

我想指出一个断言可能只发生在一个线程中,但是如果您决定提前终止该线程,它的缺失可能会导致其他错误(可能还有其他断言)稍后发生;可能导致内核完全崩溃并丢失 GPU 上的所有信息。

此外,“在内核调用中使用断言”中给出的答案只有在断言直接在 __ global__ 函数中使用而不是在 __ device__ 函数内部某处更深的情况下才有效。

我的建议是,即使断言失败,您也可以正常处理您的代码,但会留下错误消息。您可以使用映射的固定内存(将主机 RAM 内存映射到 GPU 地址空间)来存储错误代码/消息。这样,即使您的内核崩溃并且 GPU 被重置,您也可能会在该映射内存中获得有价值的信息。如果我没记错的话,几乎所有 Compute Capability 1.1 及更高版本的设备都支持映射、固定内存。

于 2011-02-26T19:32:09.103 回答
3

您可能会发现这很有帮助:

在内核调用中使用断言

或者,您可以使用 cudaThreadSynchronize() 捕获cudaError,它为您提供了内核返回错误的大约 40 种不同原因之一。但大多数情况下,您可以使用内核中的 if/else 命令检查这些条件。

于 2011-02-25T07:43:19.510 回答