news 2026/6/15 4:19:53

CANN/runtime:Stream同步与Event同步的区别与选择

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/runtime:Stream同步与Event同步的区别与选择

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同步,导致任务依赖关系不正确。

可能原因

  1. 不理解两种同步机制差异:Stream 同步阻塞整流,Event 同步精细控制。
  2. 错误选择同步方式:单流等待用 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 协调:使用 Event,stream1 Record,stream2 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); // 仅等待算子完成,不等待后续复制

相关 issue

  • Issue #477: aclrtSynchronizeStream报错507015

【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 4:18:49

解锁iOS YouTube全新体验:YouTube Plus深度功能解析与实用指南

解锁iOS YouTube全新体验&#xff1a;YouTube Plus深度功能解析与实用指南 【免费下载链接】YTLite A flexible enhancer for YouTube on iOS 项目地址: https://gitcode.com/GitHub_Trending/yt/YTLite 你是否厌倦了iOS版YouTube应用的限制&#xff1f;想要摆脱广告干扰…

作者头像 李华
网站建设 2026/6/15 4:10:49

从一次应急响应看致远OA wpsAssistServlet漏洞:攻击痕迹分析与排查指南

企业安全实战&#xff1a;致远OA wpsAssistServlet漏洞应急响应全流程指南当企业安全监控系统突然弹出红色告警&#xff0c;显示OA系统存在可疑文件上传行为时&#xff0c;作为安全团队负责人的你&#xff0c;心跳是否会漏跳一拍&#xff1f;致远OA作为国内广泛使用的协同办公平…

作者头像 李华
网站建设 2026/6/15 4:09:50

Mpx框架模板语法详解:从基础到高级用法

Mpx框架模板语法详解&#xff1a;从基础到高级用法 【免费下载链接】mpx Mpx&#xff0c;一款具有优秀开发体验和深度性能优化的增强型跨端小程序框架 项目地址: https://gitcode.com/GitHub_Trending/mp/mpx 还在为小程序开发中繁琐的模板语法而烦恼吗&#xff1f;Mpx框…

作者头像 李华
网站建设 2026/6/15 4:08:00

5G HARQ实战解析:从协议到代码实现的避坑指南

5G HARQ实战解析&#xff1a;从协议到代码实现的避坑指南在5G通信系统的开发中&#xff0c;混合自动重传请求(HARQ)机制是确保数据传输可靠性的核心技术之一。不同于教科书式的概念讲解&#xff0c;本文将聚焦于HARQ在实际工程实现中的关键挑战和解决方案。我们将从协议栈开发者…

作者头像 李华