Stream同步与Event同步的区别与选择【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime问题现象描述现象1不理解Stream同步和Event同步的差异混淆两种同步机制的使用范围和特性导致选择不当。典型错误场景// 需要等待跨Stream任务完成但使用了Stream同步 aclrtSynchronizeStream(stream1); // 仅等待 stream1不等待 stream2现象2同步时机选择不当导致性能问题或死锁错误选择同步方式单流等待用Event过度设计多流协调用Stream同步会阻塞。典型错误场景// 单Stream内等待但使用了Event同步过度设计 aclrtEvent event; aclrtRecordEvent(event, stream); aclrtSynchronizeEvent(event); // Event同步比Stream同步更复杂现象3错误使用同步接口导致任务执行顺序混乱跨Stream协调时未使用Event同步导致任务依赖关系不正确。可能原因不理解两种同步机制差异Stream 同步阻塞整流Event 同步精细控制。错误选择同步方式单流等待用 Event多流协调用 Stream顺序颠倒。处理步骤原因1不理解两种同步机制差异解决方法理解 Stream 同步特性作用范围阻塞指定 Stream 上的所有任务直到全部完成适用场景等待单个 Stream 的整批任务完成接口aclrtSynchronizeStream(stream)理解 Event 同步特性作用范围精确控制到某个时间点支持跨 Stream 同步适用场景跨 Stream 任务协调、精细时间点控制接口aclrtRecordEvent、aclrtSynchronizeEvent、aclrtStreamWaitEvent对比示例// Stream 同步等待整流任务完成 aclrtMemcpyAsync(dst, size, src, size, ACL_MEMCPY_HOST_TO_DEVICE, stream); myKernel..., stream(); aclrtMemcpyAsync(host, size, dst, size, ACL_MEMCPY_DEVICE_TO_HOST, stream); aclrtSynchronizeStream(stream); // 等待上述3个任务全部完成 // Event 同步精确控制时间点 aclrtEvent event1, event2; aclrtCreateEvent(event1); aclrtCreateEvent(event2); aclrtMemcpyAsync(dst, size, src, size, ACL_MEMCPY_HOST_TO_DEVICE, stream1); aclrtRecordEvent(event1, stream1); // 记录时间点1 aclrtStreamWaitEvent(stream2, event1); // stream2 等待 event1 myKernel..., stream2(); aclrtRecordEvent(event2, stream2); // 记录时间点2 aclrtSynchronizeEvent(event2); // 等待 event2 时间点完成原因2错误选择同步方式解决方法单 Stream 等待使用 aclrtSynchronizeStream简单直接跨 Stream 协调使用 Eventstream1 Recordstream2 Wait精细时间点控制使用 Event记录和等待特定时间点避免过度设计单流场景不要用 Event 同步场景选择示例// 场景1单 Stream 等待整批任务 → Stream 同步 aclrtStream stream; aclrtCreateStream(stream); aclrtMemcpyAsync(dst, size, src, size, ACL_MEMCPY_HOST_TO_DEVICE, stream); myKernel..., stream(); aclrtMemcpyAsync(host, size, dst, size, ACL_MEMCPY_DEVICE_TO_HOST, stream); // 推荐Stream 同步 aclrtSynchronizeStream(stream); // 等待整流完成 // 不推荐Event 同步过度设计 aclrtEvent event; aclrtRecordEvent(event, stream); aclrtSynchronizeEvent(event); // 多了一步 RecordEvent复杂度高 // 场景2跨 Stream 协调 → Event 同步 aclrtStream stream1, stream2; aclrtCreateStream(stream1); aclrtCreateStream(stream2); aclrtMemcpyAsync(dst1, size, src1, size, ACL_MEMCPY_HOST_TO_DEVICE, stream1); // 推荐Event 同步 aclrtEvent event; aclrtRecordEvent(event, stream1); // stream1 记录时间点 aclrtStreamWaitEvent(stream2, event); // stream2 等待该时间点 aclrtMemcpyAsync(dst2, size, src2, size, ACL_MEMCPY_HOST_TO_DEVICE, stream2); // 不推荐Stream 同步会阻塞 stream1影响并发 aclrtSynchronizeStream(stream1); // 阻塞 stream1 全部任务 aclrtMemcpyAsync(dst2, size, src2, size, ACL_MEMCPY_HOST_TO_DEVICE, stream2); // 场景3精细时间点控制 → Event 同步 aclrtEvent event1, event2, event3; aclrtCreateEvent(event1); aclrtCreateEvent(event2); aclrtCreateEvent(event3); aclrtMemcpyAsync(dst, size, src, size, ACL_MEMCPY_HOST_TO_DEVICE, stream); aclrtRecordEvent(event1, stream); // 记录复制完成时间点 myKernel..., stream(); aclrtRecordEvent(event2, stream); // 记录算子完成时间点 aclrtMemcpyAsync(host, size, dst, size, ACL_MEMCPY_DEVICE_TO_HOST, stream); aclrtRecordEvent(event3, stream); // 记录输出复制完成时间点 // 灵活等待特定时间点 aclrtSynchronizeEvent(event2); // 仅等待算子完成不等待后续复制相关 issueIssue #477: aclrtSynchronizeStream报错507015【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
CANN/runtime:Stream同步与Event同步的区别与选择
发布时间:2026/6/15 4:20:09
Stream同步与Event同步的区别与选择【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime问题现象描述现象1不理解Stream同步和Event同步的差异混淆两种同步机制的使用范围和特性导致选择不当。典型错误场景// 需要等待跨Stream任务完成但使用了Stream同步 aclrtSynchronizeStream(stream1); // 仅等待 stream1不等待 stream2现象2同步时机选择不当导致性能问题或死锁错误选择同步方式单流等待用Event过度设计多流协调用Stream同步会阻塞。典型错误场景// 单Stream内等待但使用了Event同步过度设计 aclrtEvent event; aclrtRecordEvent(event, stream); aclrtSynchronizeEvent(event); // Event同步比Stream同步更复杂现象3错误使用同步接口导致任务执行顺序混乱跨Stream协调时未使用Event同步导致任务依赖关系不正确。可能原因不理解两种同步机制差异Stream 同步阻塞整流Event 同步精细控制。错误选择同步方式单流等待用 Event多流协调用 Stream顺序颠倒。处理步骤原因1不理解两种同步机制差异解决方法理解 Stream 同步特性作用范围阻塞指定 Stream 上的所有任务直到全部完成适用场景等待单个 Stream 的整批任务完成接口aclrtSynchronizeStream(stream)理解 Event 同步特性作用范围精确控制到某个时间点支持跨 Stream 同步适用场景跨 Stream 任务协调、精细时间点控制接口aclrtRecordEvent、aclrtSynchronizeEvent、aclrtStreamWaitEvent对比示例// Stream 同步等待整流任务完成 aclrtMemcpyAsync(dst, size, src, size, ACL_MEMCPY_HOST_TO_DEVICE, stream); myKernel..., stream(); aclrtMemcpyAsync(host, size, dst, size, ACL_MEMCPY_DEVICE_TO_HOST, stream); aclrtSynchronizeStream(stream); // 等待上述3个任务全部完成 // Event 同步精确控制时间点 aclrtEvent event1, event2; aclrtCreateEvent(event1); aclrtCreateEvent(event2); aclrtMemcpyAsync(dst, size, src, size, ACL_MEMCPY_HOST_TO_DEVICE, stream1); aclrtRecordEvent(event1, stream1); // 记录时间点1 aclrtStreamWaitEvent(stream2, event1); // stream2 等待 event1 myKernel..., stream2(); aclrtRecordEvent(event2, stream2); // 记录时间点2 aclrtSynchronizeEvent(event2); // 等待 event2 时间点完成原因2错误选择同步方式解决方法单 Stream 等待使用 aclrtSynchronizeStream简单直接跨 Stream 协调使用 Eventstream1 Recordstream2 Wait精细时间点控制使用 Event记录和等待特定时间点避免过度设计单流场景不要用 Event 同步场景选择示例// 场景1单 Stream 等待整批任务 → Stream 同步 aclrtStream stream; aclrtCreateStream(stream); aclrtMemcpyAsync(dst, size, src, size, ACL_MEMCPY_HOST_TO_DEVICE, stream); myKernel..., stream(); aclrtMemcpyAsync(host, size, dst, size, ACL_MEMCPY_DEVICE_TO_HOST, stream); // 推荐Stream 同步 aclrtSynchronizeStream(stream); // 等待整流完成 // 不推荐Event 同步过度设计 aclrtEvent event; aclrtRecordEvent(event, stream); aclrtSynchronizeEvent(event); // 多了一步 RecordEvent复杂度高 // 场景2跨 Stream 协调 → Event 同步 aclrtStream stream1, stream2; aclrtCreateStream(stream1); aclrtCreateStream(stream2); aclrtMemcpyAsync(dst1, size, src1, size, ACL_MEMCPY_HOST_TO_DEVICE, stream1); // 推荐Event 同步 aclrtEvent event; aclrtRecordEvent(event, stream1); // stream1 记录时间点 aclrtStreamWaitEvent(stream2, event); // stream2 等待该时间点 aclrtMemcpyAsync(dst2, size, src2, size, ACL_MEMCPY_HOST_TO_DEVICE, stream2); // 不推荐Stream 同步会阻塞 stream1影响并发 aclrtSynchronizeStream(stream1); // 阻塞 stream1 全部任务 aclrtMemcpyAsync(dst2, size, src2, size, ACL_MEMCPY_HOST_TO_DEVICE, stream2); // 场景3精细时间点控制 → Event 同步 aclrtEvent event1, event2, event3; aclrtCreateEvent(event1); aclrtCreateEvent(event2); aclrtCreateEvent(event3); aclrtMemcpyAsync(dst, size, src, size, ACL_MEMCPY_HOST_TO_DEVICE, stream); aclrtRecordEvent(event1, stream); // 记录复制完成时间点 myKernel..., stream(); aclrtRecordEvent(event2, stream); // 记录算子完成时间点 aclrtMemcpyAsync(host, size, dst, size, ACL_MEMCPY_DEVICE_TO_HOST, stream); aclrtRecordEvent(event3, stream); // 记录输出复制完成时间点 // 灵活等待特定时间点 aclrtSynchronizeEvent(event2); // 仅等待算子完成不等待后续复制相关 issueIssue #477: aclrtSynchronizeStream报错507015【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考