CANN/SHMEM CMO缓存维护操作示例
CMO (Cache Maintenance Operation) 功能演示与读性能测试示例【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem功能简介本示例演示了如何使用Shmem的CMOCache Maintenance Operation接口来优化GMGlobal Memory内存访问性能。该CMO接口提供L2缓存管理操作可以通过预取Prefetch将数据从GM提前加载到L2缓存中从而减少数据访问延迟提升整体计算性能。L2缓存背景知识昇腾AI处理器采用多级缓存架构L2缓存是二级缓存位于AI Core和全局内存HBM之间具有以下特点容量大容量高速缓存A2/A3 经典值192MB访问速度缓存命中带宽约为缓存miss带宽的2~4倍缓存管理支持提前将数据加载到缓存掩盖内存访问延迟通过合理使用CMO预取操作可以在计算进行的同时提前准备下一批数据提升整体性能。测试场景一、本示例对比了以下三种缓存预取操作策略下GM读的性能表现无预取 (NO_PREFETCH)直接从GM拷贝数据不使用任何缓存优化Host侧预取 (HOST_PREFETCH)使用Host侧接口aclrtCmoAsync对整块需要拷贝的位置进行预取Device块内预取 (DEVICE_BLOCK_PREFETCH)在kernel内部分别对各个块需要拷贝的内存位置进行CMO预取操作二、测试Device侧CMO接口aclshmemx_cmo_nbi的性能表现对比了不同预取大小下的操作时延。核心接口CMO接口SHMEM扩展接口template typename T void aclshmemx_cmo_nbi(__gm__ T *src, uint32_t elem_size, ACLSHMEMCMOTYPE cmo_type, __ubuf__ T *buf, uint32_t ub_size, uint32_t sync_id);功能在Device侧异步触发CMO操作向STARS队列提交操作任务参数说明src全局内存地址elem_size元素数量cmo_typeCMO操作类型当前仅支持CMO_TYPE_PREFETCHbuf临时UB缓冲区地址ub_sizeUB缓冲区大小至少64字节64字节对齐sync_id同步ID特点基于SDMA引擎实现支持核级细粒度控制CMO操作类型注意当前SHMEM实现仅支持CMO_TYPE_PREFETCH操作。CMO_TYPE_PREFETCH预取操作将数据从全局内存提前加载到L2缓存CMO_TYPE_WRITEBACK写回操作将L2缓存中的修改数据写回全局内存同时在缓存中保留副本CMO_TYPE_INVALID失效操作丢弃L2缓存中的数据块CMO_TYPE_FLUSH刷新操作强制将L2缓存数据写回全局内存并从缓存中移除SDMA Quiet接口SHMEM扩展接口template typename T ACLSHMEM_DEVICE void aclshmemx_sdma_quiet(AscendC::LocalTensorT buf, uint32_t sync_id);功能等待STARS队列中的操作任务完成用于同步参数说明buf临时UB缓冲区地址ub_sizeUB缓冲区大小sync_id同步ID特点通过下SDMA的Flag任务并轮询Flag等待STARS队列中的操作完成环境要求硬件要求昇腾AI处理器Atlas 200I A2/A3、Atlas 300T A2/A3等架构兼容aarch64、x86软件依赖参考SHMEM软件依赖配置支持SDMA功能的相关CANN版本。功能依赖说明重要本示例中的Device侧CMO接口aclshmemx_cmo_nbi依赖SDMA功能需要参考example/sdma或example/cmo配置attributes.option_attr.data_op_engine_type ACLSHMEM_DATA_OP_SDMA以启动SDMA引擎。编译步骤1. 编译并安装SHMEM软件包cd shmem/ bash scripts/build.sh -package ./install/*/SHMEM_1.0.0_linux-*.run --install source install/set_env.sh2. 编译示例程序cd shmem/ bash scripts/build.sh -examples编译成功后可执行文件位于build/bin/cmo运行方法cd shmem/examples/cmo bash run.sh -pes ${PEs} -type ${TYPE}参数说明PEs指定用于运行的设备NPU数量限定单台机器内。TYPE指定传输数据类型当前支持intuint8int64fp16fp32。运行示例使用2个NPU测试int类型数据bash run.sh -pes 2 -type int输出结果控制台输出程序运行时会输出每个PE的完成信息PE 0 Finished! PE 1 Finished! [SUCCESS] demo run success in pe 0 [SUCCESS] demo run success in pe 1CSV文件输出程序会在output/目录下生成以下CSV文件1.{PE_ID}_band.csv- 带宽性能测试结果包含以下列loop_times: 循环次数默认100次copy_size_per_loop: 每次循环拷贝的数据大小小于L2 Cache大小以验证整块预取效果blocks: 使用的block数量copypad_size: 单次DataCopy操作的数据大小no_prefetch_time/us: 无预取平均拷贝时间微秒no_prefetch_band/Gbps: 无预取平均拷贝带宽GB/shost_prefetch_time/us: Host侧整块预取后平均拷贝时间微秒host_prefetch_band/Gbps: Host侧预取后平均拷贝带宽GB/sdevice_block_prefetch_time/us: Device块预取后平均拷贝时间微秒device_block_prefetch_band/Gbps: Device块预取后平均拷贝带宽GB/s2.{PE_ID}_cmo.csv- CMO操作延迟测试结果包含以下列loop_times: 循环次数默认100次blocks: 使用的block数量cmo_size: CMO操作的数据大小cmo_send_time_p05/us: CMO发送时间的5%分位数微秒cmo_send_time_p50/us: CMO发送时间的50%分位数微秒cmo_send_time_p95/us: CMO发送时间的95%分位数微秒cmo_flag_time_p05/us: CMO同步等待时间的5%分位数微秒cmo_flag_time_p50/us: CMO同步等待时间的50%分位数微秒cmo_flag_time_p95/us: CMO同步等待时间的95%分位数微秒性能指标说明带宽衡量数据传输速率单位为GB/s延迟衡量操作完成时间单位为微秒分位数用于统计分布情况p50为中位数。参考文档CANN应用开发接口文档内存管理 aclrtCmoAsync【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考