CUDA Academy · 课时

创建并使用流

提交相互独立的工作队列

第 2 / 4 课13 个步骤

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

独立的工作队列

非默认流就是您自己的工作队列。两个流可以独立运行,因此 GPU 能够同时推进两边的工作。🧵

流句柄

流保存在 cudaStream_t 句柄中。您创建一次,将它传给各个调用,并在使用完毕后销毁它。

cudaStream_t stream;

创建流

调用 cudaStreamCreate 来创建一个新流。它会分配驱动程序用于调度该流工作的队列。

cudaStreamCreate(&stream);

在流中启动内核

内核的启动配置有第四个参数:共享内存大小,然后是流。将您的流传入,即可把内核排入该流。

kernel<<<grid, block, 0, stream>>>(d_data);

两个流,两个任务

将一个任务放到 streamA,另一个任务放到 streamB。如果两者之间没有依赖关系,GPU 就可以并发运行它们。

kA<<<g, b, 0, streamA>>>(a);
kB<<<g, b, 0, streamB>>>(d);

天然异步

流调用是异步的:主机会立即返回并继续执行。GPU 会按照自己的节奏处理队列。

等待一个流

使用 cudaStreamSynchronize 可以阻塞主机,直到指定的流完成,而不必等待整个设备。

cudaStreamSynchronize(stream);

无阻塞检查

想快速查看状态吗?cudaStreamQuery 会在流完成时返回 cudaSuccess,在流仍然繁忙时返回 cudaErrorNotReady,而且不会让您停下来等待。

cudaStreamQuery(stream);

清理资源

当不再需要某个流时,请使用 cudaStreamDestroy 释放它。在句柄被释放前,待处理的工作仍会完成。

cudaStreamDestroy(stream);

非阻塞流

使用 cudaStreamNonBlocking 标志创建流,使其不会与传统默认流发生隐式同步。

cudaStreamCreateWithFlags(&s, cudaStreamNonBlocking);

更多流,更多重叠

将独立的数据块分散到多个流中,可以让调度器持续为各个引擎提供工作。流的数量超过几个后,随着硬件逐渐填满,收益会递减。

快速检查

如何将内核排入指定的流?

回顾

现在您可以创建流、在流中启动内核、进行同步或查询,以及销毁流。独立的流能够实现真正的并发。✨

免费开始

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

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

课程
30
课程
120

常见问题解答

「创建并使用流」课时是免费的吗?

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

「创建并使用流」这节课中我会学到什么?

提交相互独立的工作队列 你通过在浏览器中直接运行的动手代码来练习 CUDA Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 CUDA Academy 需要有经验吗?

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

「创建并使用流」课时需要多长时间?

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

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

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

此课程中的所有课时

  1. 默认流陷阱
  2. 创建并使用流
  3. 使用事件进行计时与同步
  4. 重叠复制与计算
← 返回 CUDA Academy