CUDA Academy · 课时

可复用的 CUDA_CHECK 宏

包装每次调用,提升安全性

第 3 / 4 课13 个步骤

可复用的 CUDA_CHECK 宏 是 CoddyKit 上的免费 CUDA Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 CUDA Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 CUDA Academy 课程共包含 4 节课。

检查每个调用很烦琐

在每个 CUDA 调用后编写 if 语句,会很快让代码变得杂乱。可复用的CUDA_CHECK宏只需一行整洁的代码即可解决问题。🧹

宏的目标

您希望封装任意调用,获取它的返回码,并在失败时明确地终止程序。一个宏就能在所有地方完成这件事。

CUDA_CHECK(cudaMalloc(&d, n));

捕获结果

在宏内部,将调用结果保存到本地cudaError_t变量中,这样无需调用两次即可完成检查。

cudaError_t e = (call);

与成功状态比较

接着,它会将错误码与cudaSuccess进行比较。如果两者相同,就什么也不做,程序照常继续执行。

if (e != cudaSuccess) { /* report */ }

输出失败位置

失败时,它会使用__FILE__和 __LINE__ 输出易读的消息,让您可以直接跳转到出错的代码行。

printf("CUDA error %s at %s:%d\n", msg, __FILE__, __LINE__);

do-while(0) 技巧

宏的主体被包裹在do-while(0)中。这样可以让宏成为一条语句,即使放在没有大括号的 if 中也能安全使用。

#define CUDA_CHECK(c) do { /* ... */ } while(0)

完整的宏示例

将这些部分组合起来,您就得到了一张紧凑、可复用的安全网,可以粘贴到任何 CUDA 项目的头文件中。

#define CUDA_CHECK(c) do { cudaError_t e=(c); if(e) exit(1); } while(0)

封装 API 调用

对任何返回错误码的调用使用它:cudaMalloc、cudaMemcpy、cudaFree。一个封装器就能统一保护它们。

CUDA_CHECK(cudaMemcpy(d, h, n, cudaMemcpyHostToDevice));

也保护启动操作

内核不会返回任何结果,因此请在启动后封装cudaGetLastError和同步操作,而不是直接封装启动语句。

kernel<<<g, b>>>();
CUDA_CHECK(cudaGetLastError());

将它放在头文件中

将宏放入共享的头文件,让每个文件都使用相同的检查方式。在这里保持一致,可以节省数小时的疑难调试时间。

快速失败,清晰失败

最大的好处是快速失败:调用一出问题,您就能得到准确的文件、行号和消息,而不是面对悄无声息的乱码。

快速检查

测试您对 CUDA_CHECK 宏的理解。

回顾:一个宏保护所有调用

CUDA_CHECK宏会获取错误码,与成功状态比较,并在失败时输出文件和行号。定义一次,在所有地方使用。🎉

免费开始

用 AI 导师学习 C++ — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
30
课程
120

常见问题解答

「可复用的 CUDA_CHECK 宏」课时是免费的吗?

是的 — 「可复用的 CUDA_CHECK 宏」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 CUDA Academy 课程的其余内容,请升级到 CoddyKit PRO。 CUDA Academy 课程共包含 4 节课。

「可复用的 CUDA_CHECK 宏」这节课中我会学到什么?

包装每次调用,提升安全性 你通过在浏览器中直接运行的动手代码来练习 CUDA Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 CUDA Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 CUDA Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「可复用的 CUDA_CHECK 宏」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 CUDA Academy 课中编写并运行代码吗?

能。每节 CUDA Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 返回代码与异步错误
  2. 启动后调用 cudaGetLastError
  3. 可复用的 CUDA_CHECK 宏
  4. 解读 cudaGetErrorString
← 返回 CUDA Academy