使用事件进行计时与同步
使用 cudaEvent 测量并安排工作顺序
使用事件进行计时与同步 是 CoddyKit 上的免费 CUDA Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 CUDA Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 CUDA Academy 课程共包含 4 节课。
什么是事件?
CUDA事件是您放入流中的一个标记。GPU 到达该位置时会记录时间,从而让您可以测量并安排工作顺序。⏱️
事件句柄
事件使用 cudaEvent_t 句柄,就像流一样。您可以创建、记录、查询事件,并在完成后销毁它。
cudaEvent_t start, stop;创建事件
为每个需要的事件调用 cudaEventCreate。计时通常需要两个事件:一个放在工作开始前,一个放在工作结束后。
cudaEventCreate(&start);
cudaEventCreate(&stop);记录事件
cudaEventRecord 会将事件放入流中。GPU 完成之前排入队列的所有工作后,会立即为事件记录时间戳。
cudaEventRecord(start, stream);测量内核时间
在同一流中记录开始事件、启动内核,然后记录结束事件。两者之间的间隔就是 GPU 的实际执行时间。
cudaEventRecord(start, s);
kernel<<<g, b, 0, s>>>(d);
cudaEventRecord(stop, s);等待事件
事件是异步的,因此主机必须等待。cudaEventSynchronize 会阻塞,直到指定事件确实已在 GPU 上记录。
cudaEventSynchronize(stop);测量经过的时间
cudaEventElapsedTime 会返回两个已记录事件之间的毫秒数。这比主机端的 CPU 时钟准确得多。
float ms;
cudaEventElapsedTime(&ms, start, stop);为什么不用 CPU 时钟?
主机计时器会包含启动开销,也无法测得真正的 GPU 时间。事件位于流内部,因此能够准确捕获设备执行的内容。
跨流排序
事件还可以同步流。cudaStreamWaitEvent 会让一个流暂停,直到另一个流中记录的事件发生。
cudaStreamWaitEvent(streamB, eventA, 0);构建依赖关系
借助流等待事件,您可以表达一个依赖关系:streamB 只有在 streamA 到达其事件后才开始工作,而且不会阻塞主机。
清理事件
不再需要的事件请使用 cudaEventDestroy 释放。与流一样,事件创建成本很低,但在长期运行的应用中也不应泄漏。
cudaEventDestroy(start);
cudaEventDestroy(stop);快速检查
哪个函数可以返回两个事件之间的时间?
回顾
事件可以精确测量 GPU 工作的时间,并安排一个流在另一个流之后执行。它们是测量和协调重叠工作的工具。🎯
用 AI 导师学习 C++ — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 30
- 课程
- 120
常见问题解答
「使用事件进行计时与同步」课时是免费的吗?
是的 — 「使用事件进行计时与同步」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 CUDA Academy 课程的其余内容,请升级到 CoddyKit PRO。 CUDA Academy 课程共包含 4 节课。
「使用事件进行计时与同步」这节课中我会学到什么?
使用 cudaEvent 测量并安排工作顺序 你通过在浏览器中直接运行的动手代码来练习 CUDA Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 CUDA Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 CUDA Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用事件进行计时与同步」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 CUDA Academy 课中编写并运行代码吗?
能。每节 CUDA Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。