现实生活中的 CUDA 编程 Part4 Error Checking

Error checking 是每个 program 的重要组成部分。 我们必须能够知道我们的 operations  何时失败,以便我们可以重试或至少记录问题以供以后分析。

tl;dr

CUDA 中的 error checking 必须手动完成,幸运的是,Toolkit 为我们提供了有用的 methods 来做到这一点。

Error checking in CUDA

对我们来说不幸的是,CUDA code 在 GPU 上运行,因此,对于 concurrent(parallel)code,there is no stack for us to receive errors from, like we’re used to having in C\C++ programs。 相反,kernel code 会悄无声息地失败 and we will never be any wiser about it。

好消息是 CUDA code 中的 error checking 是可能的,坏消息是它需要手工完成而且仍然缺乏。 让我告诉你我的意思。

运行时提供了一个 error variable,该 variable 最初设置为 cudaSuccess 并在每次 CUDA code 出现 error 时被覆盖。

CUDA provides us with two functions for error checking。 cudaPeekAtLastError 和 cudaGetLastError 。 这两个 functions 之间的区别在于它们如何处理 success variable。 第一个只返回 error variable,而后者还将 error variable 重置为 cudaSuccess 。 为了确保在 asynchronous calls(大多数 calls 在 GPU context 中)之后 variable 是正确的,我们必须调用 synchronization method cudaDeviceSyncronize

Tips and Tricks

使用 CUDA error checking methods 时,有两个主要 tips 要遵循。

  1. Always check the errors before you run the main functions of your code。 我已经记不清有多少次我在我的 code 中找不到 error function 报告的 error,仅仅是因为 error 源于一些与 main code 无关的愚蠢的事情,例如 a bad cast to a variable 或 badly allocated memory。
  2. 使用 wrapper function 可以正确、轻松地报告 errors。
 1 #define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
 2 inline void gpuAssert(cudaError_t code, const char *file, int line, bool abort =
 3 true) {
 4     if (code != cudaSuccess) {
 5         fprintf(stderr, "GPUassert: %s %s %d\n", cudaGetErrorString(code), file,
 6                 line);
 7         if (abort)
 8             exit(code);
 9     }
10 }
11 
12 /*CUDAErrCheck.cpp*/

此 function 可用于包装任何返回 cuda errors 的函数。 例如:

1 // Check when allocating memory
2 gpuErrchk(cudaMallocManaged(&(this->deviceFeatures), size));
3 
4 // Check before and after function call
5 gpuErrchk(cudaPeekAtLastError());
6 gpuErrchk(cudaDeviceSynchronize());
7 
8 /*CUDAErrCheckExamples.cpp */

Conclusion

Error checking 是任何 program 的关键部分。 虽然 CUDA 中的 error checking 不像大多数 programs 那样简单,但它本身并不复杂,但需要比平时更多的手动工作。

使用 CUDA Toolkit 中包含的 error checking mechanism,即使在 GPU code 中,我们也能够成功监控和管理 errors。

Good Luck!

 

posted @ 2023-06-01 18:32  ImreW  阅读(14)  评论(0编辑  收藏  举报