文件最后提交记录最后更新时间
支持CMO特性 Co-authored-by: qq_42429861<xunmeng20000327@163.com> # message auto-generated for no-merge-commit merge: !142 merge cmo_xun into master 支持CMO特性 Created-by: mengxun233 Commit-by: mengxun233;qq_42429861 Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 支持CMO(Cache Manager Operation)特性 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #123--> 关联Issue [#107](https://gitcode.com/cann/shmem/issues/107) <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> [UT](https://raw.gitcode.com/user-images/assets/8546182/0a691bfc-7916-4594-8ab3-9e02350634fd/image.png) ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/shmem!1423 个月前
更新cmo样例readme Co-authored-by: mengxun233<xunmeng20000327@163.com> # message auto-generated for no-merge-commit merge: !163 merge cmo into master 更新cmo样例readme Created-by: mengxun233 Commit-by: mengxun233 Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 更新cmo example中的README.md ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #123--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> [#107](https://gitcode.com/cann/shmem/issues/107) ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> 无测试 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 更新cmo example中的README.md ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/shmem!1632 个月前
fix spell problem Co-authored-by: Z_ZW2025<zhuozhenwei1@h-partners.com> # message auto-generated for no-merge-commit merge: !289 merge master into master fix spell problem Created-by: Z_ZW2025 Commit-by: Z_ZW2025 Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 注释拼写错误修改 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #123--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> https://gitcode.com/cann/shmem/issues/210 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/shmem!2891 个月前
整改部分样例的文档和脚本环境变量 Co-authored-by: hbhdhd<luxianbin1@huawei.com> # message auto-generated for no-merge-commit merge: !269 merge docs into master 整改部分样例的文档和脚本环境变量 Created-by: hbhdhd Commit-by: hbhdhd Merged-by: cann-robot Description: ## 描述 修改环境变量名称不一致问题。 **问题**:代码读取的环境变量是 SHMEM_UID_SESSION_ID,部分文档和脚本中使用的是 ACLSHMEM_UID_SESSION_ID。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #123--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> 关联Issue [#209](https://gitcode.com/cann/shmem/issues/209) ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 更新了相关示例的脚本和 README 文件。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/shmem!2691 个月前
README.md

CMO (Cache Maintenance Operation) 功能演示与读性能测试示例

功能简介

本示例演示了如何使用Shmem的CMO(Cache Maintenance Operation)接口来优化GM(Global Memory)内存访问性能。该CMO接口提供L2缓存管理操作,可以通过预取(Prefetch)将数据从GM提前加载到L2缓存中,从而减少数据访问延迟,提升整体计算性能。

L2缓存背景知识

昇腾AI处理器采用多级缓存架构,L2缓存是二级缓存,位于AI Core和全局内存(HBM)之间,具有以下特点:

  • 容量:大容量高速缓存(A2/A3 经典值192MB)
  • 访问速度:缓存命中带宽约为缓存miss带宽的2~4倍
  • 缓存管理:支持提前将数据加载到缓存,掩盖内存访问延迟

通过合理使用CMO预取操作,可以在计算进行的同时提前准备下一批数据,提升整体性能。

测试场景

一、本示例对比了以下三种缓存预取操作策略下,GM读的性能表现:

  1. 无预取 (NO_PREFETCH):直接从GM拷贝数据,不使用任何缓存优化
  2. Host侧预取 (HOST_PREFETCH):使用Host侧接口aclrtCmoAsync对整块需要拷贝的位置进行预取
  3. 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_type:CMO操作类型(当前仅支持CMO_TYPE_PREFETCH)
    • buf:临时UB缓冲区地址
    • ub_size:UB缓冲区大小(至少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::LocalTensor<T> &buf, uint32_t sync_id);
  • 功能:等待STARS队列中的操作任务完成,用于同步
  • 参数说明
    • buf:临时UB缓冲区地址
    • ub_size:UB缓冲区大小
    • 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.sh

2. 编译示例程序

cd shmem/
bash scripts/build.sh -examples

编译成功后,可执行文件位于:build/bin/cmo

运行方法

cd shmem/examples/cmo
bash run.sh -pes ${PEs} -type ${TYPE}

参数说明

  • PEs:指定用于运行的设备(NPU)数量,限定单台机器内。
  • TYPE:指定传输数据类型,当前支持:int,uint8,int64,fp16,fp32。

运行示例:使用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 1

CSV文件输出

程序会在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/s)
  • host_prefetch_time/us: Host侧整块预取后,平均拷贝时间(微秒)
  • host_prefetch_band/Gbps: Host侧预取后,平均拷贝带宽(GB/s)
  • device_block_prefetch_time/us: Device块预取后,平均拷贝时间(微秒)
  • device_block_prefetch_band/Gbps: Device块预取后,平均拷贝带宽(GB/s)

2. {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为中位数。

参考文档