
DataCopy伴随原子操作样例【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit概述本样例基于SetAtomicAdd和SetAtomicMax原子操作接口介绍数据从 VECOUT 向 GM 搬运时原子累加和原子最大值比较的实现流程。需要注意在调用原子操作接口完成相关操作后要调用DisableDmaAtomic()关闭原子模式防止后续其他计算受影响。接口提示除本样例使用的SetAtomicAdd、SetAtomicMax接口外Ascend C还提供了SetAtomicMin接口用于配置 VECOUT到GM的传输规则。SetAtomicMin的调用方式与SetAtomicMax一致只需替换函数名即可切换。本样例支持的产品及CANN软件版本产品CANN软件版本Ascend 950PR/Ascend 950DT CANN 9.1.0Atlas A3 训练系列产品/Atlas A3 推理系列产品 CANN 9.0.0Atlas A2 训练系列产品/Atlas A2 推理系列产品 CANN 9.0.0目录结构介绍├── data_movement_with_atomic_operations │ ├── scripts │ │ ├── gen_data.py // 输入数据和真值数据生成脚本 │ │ └── verify_result.py // 验证输出数据和真值数据是否一致的验证脚本 │ ├── CMakeLists.txt // 编译工程文件 │ ├── data_utils.h // 数据读入写出函数 │ ├── data_movement_with_atomic_operations.asc // Ascend C样例实现 调用样例 │ └── README.md // 样例说明文档场景详细说明本样例通过编译参数SCENARIO_NUM来切换不同的场景表1场景配置对照表scenarioNum原子操作接口输入Shape输出Shape数据类型说明1SetAtomicAdd[1, 256]三个核读取相同[1, 256]half三个核读取相同输入原子累加操作2SetAtomicMax[1, 256]×3三个核读取不同[1, 256]half三个核读取不同输入原子最大值比较操作场景1SetAtomicAdd原子累加操作三个核读取相同输入输入shapesrc[1, 256]三个核同时读取 input_x.bindst[1, 256]输入input_y.bin表示dst上已有的数据输出shapedst[1, 256]数据类型half说明三个核同时读取相同的输入数据input_x.bin通过SetAtomicAdd开启原子累加模式将各自的数据累加到共享的输出缓冲区结果为input_y input_x*3场景2SetAtomicMax原子最大值比较操作三个核读取不同输入输入shapesrc0[1, 256]、src1[1, 256]、src2[1, 256]三个核分别读取 input_x0.bin、input_x1.bin、input_x2.bin输出shapedst[1, 256]数据类型half说明三个核通过GetBlockIdx()获取自身编号分别读取不同的输入数据input_x0.bin、input_x1.bin、input_x2.bin通过SetAtomicMax开启原子最大值比较模式每位输出为三个输入中的最大值样例描述样例规格表2样例规格说明样例输入nameshapedata typeformatsrc[1, 256]halfND样例输出dst[1, 256]halfND核函数名data_movement_with_atomic_operations_custom并行block数3编译运行在本样例根目录下执行如下步骤编译并执行样例。配置环境变量 请根据当前环境上CANN开发套件包的安装方式配置环境变量。source ${install_path}/cann/set_env.sh说明${install_path}为CANN包安装目录未指定安装目录时默认安装至/usr/local/Ascend下。样例执行在本样例目录下执行如下命令。SCENARIO_NUM1 # 设置场景编号取值为1、2 mkdir -p build cd build; # 创建并进入build目录 cmake .. -DCMAKE_ASC_ARCHITECTURESdav-2201 -DSCENARIO_NUM$SCENARIO_NUM;make -j; # 编译工程 python3 ../scripts/gen_data.py -scenarioNum $SCENARIO_NUM # 生成测试输入数据 ./demo # 执行编译生成的可执行程序执行样例 python3 ../scripts/verify_result.py output/output.bin output/golden.bin # 验证输出结果是否正确使用CPU调试或NPU仿真模式时添加-DCMAKE_ASC_RUN_MODEcpu或-DCMAKE_ASC_RUN_MODEsim参数即可。示例如下cmake .. -DCMAKE_ASC_RUN_MODEcpu -DCMAKE_ASC_ARCHITECTURESdav-2201 -DSCENARIO_NUM$SCENARIO_NUM;make -j; # CPU调试模式 cmake .. -DCMAKE_ASC_RUN_MODEsim -DCMAKE_ASC_ARCHITECTURESdav-2201 -DSCENARIO_NUM$SCENARIO_NUM;make -j; # NPU仿真模式注意切换编译模式前需清理 cmake 缓存可在 build 目录下执行rm CMakeCache.txt后重新 cmake。编译选项说明选项可选值说明CMAKE_ASC_RUN_MODEnpu默认、cpu、sim运行模式NPU 运行、CPU调试、NPU仿真CMAKE_ASC_ARCHITECTURESdav-2201默认、dav-3510NPU 架构dav-2201 对应 Atlas A2 训练系列产品/Atlas A2 推理系列产品和 Atlas A3 训练系列产品/Atlas A3 推理系列产品dav-3510 对应 Ascend 950PR/Ascend 950DTSCENARIO_NUM1默认、2场景编号1SetAtomicAdd原子累加、2SetAtomicMax原子最大值比较执行结果执行结果如下说明精度对比成功test pass!【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考