已合并
同步 CheckerL2 最新代码到 hccl_vm #4390
git_qk创建于 8月4日
同步 CheckerL2 最新代码到 hccl_vm #4390
已合并
git_qk创建于 8月4日
37 个文件变更+615-406
@@ -91,6 +91,7 @@ include(cmake/third_party/nlohmann_json.cmake)
91include(cmake/third_party/cli11.cmake)91include(cmake/third_party/cli11.cmake)
92include(cmake/third_party/spdlog.cmake)92include(cmake/third_party/spdlog.cmake)
93include(cmake/third_party/sqlite3.cmake)93include(cmake/third_party/sqlite3.cmake)
94+include(cmake/third_party/cann_cmake.cmake)
94 95 
95include_directories(96include_directories(
96 ${CMAKE_SOURCE_DIR}/third_party/nlohmann_json97 ${CMAKE_SOURCE_DIR}/third_party/nlohmann_json
@@ -39,7 +39,7 @@ hccl_test是昇腾官方提供的HCCL性能测试工具,详见[HCCL性能测
39 39 
40### 3.1 一键安装40### 3.1 一键安装
41 41 
42-一行完成依赖安装、源码拉取、CANN 检测与编译(默认 `campus-2026` 配套方案)。工作目录与手动安装保持一致,用 `/home/workspace`(后文示例路径均以此为准):42+一行完成依赖安装、源码拉取、CANN 检测与编译(默认 `main` 配套方案)。工作目录与手动安装保持一致,用 `/home/workspace`(后文示例路径均以此为准):
43 43 
44```bash44```bash
45# 创建并进入工作目录(脚本默认装到当前目录)45# 创建并进入工作目录(脚本默认装到当前目录)
@@ -56,7 +56,7 @@ curl -fsSL https://raw.gitcode.com/cann/hcomm/raw/competition%2Fcampus-2026/test
56**hccl_test**:默认一并编译 OpenMPI 与 hccl_test 性能测试工具,`--skip-hccl-test` 可关闭。56**hccl_test**:默认一并编译 OpenMPI 与 hccl_test 性能测试工具,`--skip-hccl-test` 可关闭。
57 57 
58**常用参数**58**常用参数**
59-- `--profile <名>`:配套方案(默认 `campus-2026`,`--list-profiles` 列全部)59+- `--profile <名>`:配套方案(默认 `main`,`--list-profiles` 列全部)
60- `--workspace <路径>`:工作目录,源码/编译/产物所在(默认当前目录)60- `--workspace <路径>`:工作目录,源码/编译/产物所在(默认当前目录)
61- `--ascend-path <路径>`:指定 CANN 目录,有则复用、无则装到此处61- `--ascend-path <路径>`:指定 CANN 目录,有则复用、无则装到此处
62- `--reinstall-cann`:重新下载覆盖现有 CANN(版本不匹配时用;默认保留)62- `--reinstall-cann`:重新下载覆盖现有 CANN(版本不匹配时用;默认保留)
@@ -89,6 +89,9 @@ source /home/workspace/Ascend/cann/set_env.sh
89export HCCL_CODE_HOME=/home/workspace/hccl89export HCCL_CODE_HOME=/home/workspace/hccl
90export HCOMM_CODE_HOME=/home/workspace/hcomm90export HCOMM_CODE_HOME=/home/workspace/hcomm
91bash ./build.sh --full91bash ./build.sh --full
92+ 
93+# 5.从CANN安装目录拷贝解压aicpu_hcxx.tar.gz
94+bash build_pkg.sh
92```95```
93 96 
94### 3.3 使用示例97### 3.3 使用示例
@@ -142,16 +145,7 @@ cd /home/workspace/hcomm/test/hccl_vm/hccl_vm_install/bin
142 145 
143AICPU展开模式需要将算法展开步骤放到设备侧执行,因此hccl-vm工具需要将HCCL的设备侧的符号编译并模拟执行。由于设备侧符号是ARM架构的,因此在X86环境上编译时需要借助交叉编译器,运行时需要借助QEMU实现AICPU模式的模拟运行。146AICPU展开模式需要将算法展开步骤放到设备侧执行,因此hccl-vm工具需要将HCCL的设备侧的符号编译并模拟执行。由于设备侧符号是ARM架构的,因此在X86环境上编译时需要借助交叉编译器,运行时需要借助QEMU实现AICPU模式的模拟运行。
144 147 
145-设备侧符号使用hccl和hcomm的源码编译,为了保证Host与Device通信协议正确,需要同时编译Host侧的安装包并进行替换安装148+1. 环境变量配置
146- 
147-1. HCCL设备侧符号编译、安装、拷贝等(若已用 [3.1 一键安装](#31-一键安装),此步已自动完成,可跳过)。
148- 
149-```bash
150-cd /home/workspace/hcomm/test/hccl_vm/
151-bash ./build_pkg.sh
152-```
153- 
154-2. 环境变量配置。
155 149 
156```bash150```bash
157# 进入工具安装目录151# 进入工具安装目录
@@ -162,7 +156,7 @@ export RANK_TABLE_FILE=$(pwd)/data/ranktable.json
162export HCCL_OP_EXPANSION_MODE="AI_CPU"156export HCCL_OP_EXPANSION_MODE="AI_CPU"
163```157```
164 158 
165-3. 执行159+2. 执行
166 160 
167```bash161```bash
168# 需要进入到新的bin文件目录下执行hccl-vm162# 需要进入到新的bin文件目录下执行hccl-vm
@@ -185,7 +179,7 @@ cd /home/workspace/hcomm/test/hccl_vm/hccl_vm_install/bin
185(hvm)$> exit179(hvm)$> exit
186```180```
187 181 
188-4. 验证hccl_test用例运行结果 [Runner结果查看](#491-runner插件结果) [Checker结果查看](#492-checker插件结果)182+3. 验证hccl_test用例运行结果 [Runner结果查看](#491-runner插件结果) [Checker结果查看](#492-checker插件结果)
189 183 
190#### 3.3.4 AIV模式184#### 3.3.4 AIV模式
191 185 
@@ -242,9 +236,10 @@ export HCCL_CODE_HOME=/home/workspace/hccl
242export HCOMM_CODE_HOME=/home/workspace/hcomm236export HCOMM_CODE_HOME=/home/workspace/hcomm
243```237```
244 238 
245-1. 若您修改了CANN hccl仓代码,请执行bash build_pkg.sh --install hccl。239+1. 若您更新/修改了CANN hccl仓代码,请执行`bash build_pkg.sh --install hccl`
246-2. 若您修改了CANN hcomm仓代码,请执行bash build_pkg.sh --install hcomm。240+2. 若您更新/修改了CANN hcomm仓代码,请执行`bash build_pkg.sh --install hcomm`
247-3. 参考[使用示例](#33-使用示例)步骤,重用例241+3. 若您同时更/修改了CANN hccl、hcomm仓代码,请执`bash build_pkg.sh --full`
242+4. 参考[使用示例](#33-使用示例)步骤,重新运行用例。
248 243 
249---244---
250 245 
@@ -803,6 +798,7 @@ data_size(Bytes): | aveg_time(us): | alg_bandwidth(GB/s): | check_result:
803| yaml-cpp | 0.8.0 | [yaml-cpp-0.8.0.tar.gz](https://raw.gitcode.com/src-openeuler/yaml-cpp/blobs/d1ead4fff417073b9cdbf98b8b55eb0efc00b0ba/yaml-cpp-0.8.0.tar.gz) |798| yaml-cpp | 0.8.0 | [yaml-cpp-0.8.0.tar.gz](https://raw.gitcode.com/src-openeuler/yaml-cpp/blobs/d1ead4fff417073b9cdbf98b8b55eb0efc00b0ba/yaml-cpp-0.8.0.tar.gz) |
804| sqlite | 3.51.0 | [sqlite-amalgamation-3510300.zip](https://www.sqlite.org/2026/sqlite-amalgamation-3510300.zip) |799| sqlite | 3.51.0 | [sqlite-amalgamation-3510300.zip](https://www.sqlite.org/2026/sqlite-amalgamation-3510300.zip) |
805| googletest | 1.14.0 | [googletest-1.14.0.tar.gz](https://gitcode.com/cann-src-third-party/googletest/releases/download/v1.14.0/googletest-1.14.0.tar.gz) |800| googletest | 1.14.0 | [googletest-1.14.0.tar.gz](https://gitcode.com/cann-src-third-party/googletest/releases/download/v1.14.0/googletest-1.14.0.tar.gz) |
801+| cann-cmake | master-044 | [cmake-master-044.tar.gz](https://raw.gitcode.com/cann/cmake/archive/refs/heads/master-044.tar.gz) |
806 802 
807### 术语表803### 术语表
808 804 
@@ -9,19 +9,112 @@
9 9 
10set -e10set -e
11 11 
12+# 脚本所在目录的绝对路径(在任何 cd 之前计算,保证后续函数能找到 asset 目录下的工具脚本)
13+readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
14+ 
15+# ==========================================
16+# 辅助函数: 原地解密并解压 AICPU 算子包
17+# ==========================================
18+# 从 ascen_package_load.ini 解析指定包的 package_path
19+function parse_ini_package_path() {
20+ # $1 = ini 路径
21+ # $2 = 要查询的包名(如 aicpu_hccl.tar.gz)
22+ local INI="$1"
23+ local NAME="$2"
24+ awk -v name="$NAME" '
25+ BEGIN { cur_name=""; cur_path="" }
26+ /^name:/ { cur_name=substr($0, 6); cur_path="" }
27+ /^package_path:/{ cur_path=substr($0, 14) }
28+ cur_name == name && cur_path != "" { print cur_path; exit }
29+ ' "$INI"
30+}
31+ 
32+# 对指定 tar.gz 包调用 ci_img_headler.py 解密(有头剥头、无头直接拷出),
33+# 然后解压到指定目标目录(--strip-components=1 去掉 aicpu_kernels_device/ 前缀)
34+function decrypt_and_extract() {
35+ # $1 = 源 tar.gz 路径(可能带头也可能裸)
36+ # $2 = 解压目标目录(工具目录)
37+ local SRC="$1"
38+ local DEST_DIR="$2"
39+ if [ ! -f "$SRC" ]; then
40+ echo "错误: 找不到源文件 $SRC"
41+ return 1
42+ fi
43+ 
44+ local HEADLER="$SCRIPT_DIR/third_party/cann-cmake/scripts/signtool/image_extract/ci_img_headler.py"
45+ if [ ! -f "$HEADLER" ]; then
46+ echo "错误: 找不到 $HEADLER,请先执行 bash build.sh --full 构建以拉取 cann-cmake 第三方依赖"
47+ return 1
48+ fi
49+ 
50+ # 创建解密临时文件(在 /tmp 下,避免对只读 CANN 目录的写需求)
51+ local RAW_TMP
52+ RAW_TMP="$(mktemp /tmp/.aich_raw.XXXXXX)" || true
53+ if [ -z "$RAW_TMP" ] || [ ! -f "$RAW_TMP" ]; then
54+ echo "错误: mktemp 创建临时文件失败"
55+ return 1
56+ fi
57+ 
58+ echo "解密 $(basename "$SRC") -> $(basename "$RAW_TMP")"
59+ python3 "$HEADLER" -img "$SRC" -raw "$RAW_TMP" --rcvr
60+ 
61+ # 创建目标目录
62+ if ! mkdir -p "$DEST_DIR"; then
63+ rm -f "$RAW_TMP"
64+ echo "错误: 创建目标目录 $DEST_DIR 失败"
65+ return 1
66+ fi
67+ 
68+ echo "解压 $(basename "$RAW_TMP") 到 $DEST_DIR (--strip-components=1)"
69+ if ! tar -zxf "$RAW_TMP" -C "$DEST_DIR" --strip-components=1; then
70+ rm -f "$RAW_TMP"
71+ echo "错误: 解压到 $DEST_DIR 失败"
72+ return 1
73+ fi
74+ 
75+ rm -f "$RAW_TMP"
76+ return 0
77+}
78+ 
79+# 部署单个 aicpu 算子包:从 CANN 安装目录读取 tarball,解密解压到指定目录
80+function deploy_aicpu_kernel_pkg() {
81+ local PKG_NAME="$1"
82+ local ASCEND_INSTALL_PATH="$2"
83+ local INI_PATH="$3"
84+ local DEST_DIR="$4"
85+ local SUB_PATH
86+ SUB_PATH=$(parse_ini_package_path "$INI_PATH" "$PKG_NAME")
87+ if [ -z "$SUB_PATH" ]; then
88+ echo "错误: $INI_PATH 中找不到 $PKG_NAME 的 package_path"
89+ return 1
90+ fi
91+ local SRC="$ASCEND_INSTALL_PATH/$SUB_PATH/$PKG_NAME"
92+ decrypt_and_extract "$SRC" "$DEST_DIR"
93+}
94+ 
12function usage() {95function usage() {
13 echo "Usage:"96 echo "Usage:"
14 echo " sh build_pkg.sh [-h | --help]"97 echo " sh build_pkg.sh [-h | --help]"
15 echo " [--install <hccl|hcomm>]"98 echo " [--install <hccl|hcomm>]"
99+ echo " [--full]"
16 echo " [--tool_path <PATH>]"100 echo " [--tool_path <PATH>]"
17 echo ""101 echo ""
18 echo "Options:"102 echo "Options:"
19 echo " -h, --help Print usage"103 echo " -h, --help Print usage"
20 echo " --install <hccl|hcomm>"104 echo " --install <hccl|hcomm>"
21- echo " Specify which component to build/install, default: both"105+ echo " Build/install the specified component, then decrypt+extract"
106+ echo " its aicpu kernel tarball to \$HCCL_VM_PATH/hccl_vm_install/lib/aarch64/"
107+ echo " --full Build/install both hccl and hcomm, then decrypt+extract both"
108+ echo " aicpu kernel tarballs to \$HCCL_VM_PATH/hccl_vm_install/lib/aarch64/"
109+ echo " (equivalent to \"--install hccl\" followed by \"--install hcomm\")"
22 echo " --tool_path <PATH>"110 echo " --tool_path <PATH>"
23 echo " Set HCCL_VM_PATH, default: current directory"111 echo " Set HCCL_VM_PATH, default: current directory"
24 echo ""112 echo ""
113+ echo "Default (no option): only decrypt+extract aicpu_hccl.tar.gz and aicpu_hcomm.tar.gz"
114+ echo " (from CANN install root, per ascend_package_load.ini)"
115+ echo " to \$HCCL_VM_PATH/hccl_vm_install/lib/aarch64/."
116+ echo " No build/install is performed."
117+ echo ""
25}118}
26 119 
27# ==========================================120# ==========================================
@@ -29,8 +122,10 @@ function usage() {
29# ==========================================122# ==========================================
30 123 
31# 1.默认值124# 1.默认值
32-BUILD_HCCL=true125+# MODE 四态:deploy_only / install_hccl / install_hcomm / full
33-BUILD_HCOMM=true126+MODE=deploy_only
127+BUILD_HCCL=false
128+BUILD_HCOMM=false
34TOOL_PATH=""129TOOL_PATH=""
35 130 
36# 2.解析命令行参数131# 2.解析命令行参数
@@ -42,9 +137,11 @@ while [[ $# -gt 0 ]]; do
42 ;;137 ;;
43 --install)138 --install)
44 if [ "$2" == "hccl" ]; then139 if [ "$2" == "hccl" ]; then
140+ MODE=install_hccl
45 BUILD_HCCL=true141 BUILD_HCCL=true
46 BUILD_HCOMM=false142 BUILD_HCOMM=false
47 elif [ "$2" == "hcomm" ]; then143 elif [ "$2" == "hcomm" ]; then
144+ MODE=install_hcomm
48 BUILD_HCCL=false145 BUILD_HCCL=false
49 BUILD_HCOMM=true146 BUILD_HCOMM=true
50 else147 else
@@ -53,6 +150,12 @@ while [[ $# -gt 0 ]]; do
53 fi150 fi
54 shift 2151 shift 2
55 ;;152 ;;
153+ --full)
154+ MODE=full
155+ BUILD_HCCL=true
156+ BUILD_HCOMM=true
157+ shift
158+ ;;
56 --tool_path)159 --tool_path)
57 if [ -n "$2" ]; then160 if [ -n "$2" ]; then
58 TOOL_PATH="$2"161 TOOL_PATH="$2"
@@ -87,19 +190,19 @@ if [ -z "$ASCEND_HOME_PATH" ]; then
87 exit 1190 exit 1
88fi191fi
89 192 
90-# 5.校验并获取 hccl 代码目录193+# 4.校验并获取 hccl 代码目录
91if [ "$BUILD_HCCL" = true ] && [ -z "$HCCL_CODE_HOME" ]; then194if [ "$BUILD_HCCL" = true ] && [ -z "$HCCL_CODE_HOME" ]; then
92 echo "错误: 环境变量 HCCL_CODE_HOME 未设置"195 echo "错误: 环境变量 HCCL_CODE_HOME 未设置"
93 exit 1196 exit 1
94fi197fi
95 198 
96-# 6.校验并获取 hcomm 代码目录199+# 5.校验并获取 hcomm 代码目录
97if [ "$BUILD_HCOMM" = true ] && [ -z "$HCOMM_CODE_HOME" ]; then200if [ "$BUILD_HCOMM" = true ] && [ -z "$HCOMM_CODE_HOME" ]; then
98 echo "错误: 环境变量 HCOMM_CODE_HOME 未设置"201 echo "错误: 环境变量 HCOMM_CODE_HOME 未设置"
99 exit 1202 exit 1
100fi203fi
101 204 
102-# 5.获得CANN安装目录: ASCEND_INSTALL_PATH205+# 6.获得CANN安装目录: ASCEND_INSTALL_PATH
103ASCEND_INSTALL_PATH=$(dirname "$ASCEND_HOME_PATH")206ASCEND_INSTALL_PATH=$(dirname "$ASCEND_HOME_PATH")
104 207 
105MACHINE_ARCH=$(uname -m)208MACHINE_ARCH=$(uname -m)
@@ -123,6 +226,7 @@ if [ "$BUILD_HCOMM" = true ]; then
123 echo "HCOMM_CODE_HOME: $HCOMM_CODE_HOME"226 echo "HCOMM_CODE_HOME: $HCOMM_CODE_HOME"
124fi227fi
125echo "构建配置:"228echo "构建配置:"
229+echo " - MODE: $MODE"
126echo " - HCCL: $BUILD_HCCL"230echo " - HCCL: $BUILD_HCCL"
127echo " - HCOMM: $BUILD_HCOMM"231echo " - HCOMM: $BUILD_HCOMM"
128echo "--------------------------"232echo "--------------------------"
@@ -190,44 +294,35 @@ else
190fi294fi
191 295 
192# ==========================================296# ==========================================
193-# 第四步:拷贝并解压 aicpu 相关的 tar.gz 297+# 第四步:从 CANN 安装目录解签名并解压 aicpu 包
194# ==========================================298# ==========================================
195echo "正在处理 aicpu 相关的构建产物..."299echo "正在处理 aicpu 相关的构建产物..."
196 300 
197-# 1. 定义源文件路径和目标文件夹路径301+INI_PATH="$ASCEND_HOME_PATH/conf/ascend_package_load.ini"
198-HCCL_AICPU_TAR=$(find "$HCCL_CODE_HOME" -name "aicpu_hccl.tar.gz" -type f | head -n 1)302+if [ ! -f "$INI_PATH" ]; then
199-HCOMM_AICPU_TAR=$(find "$HCOMM_CODE_HOME" -name "aicpu_hcomm.tar.gz" -type f | head -n 1)303+ echo "错误: 找不到 $INI_PATH"
200-TARGET_DIR="$HCCL_VM_PATH/hccl_vm_install/lib/aarch64"304+ exit 1
305+fi
201 306 
202-# 2.确保目标目录存在307+# AICPU 算子解压目标目录
203-mkdir -p "$TARGET_DIR"308+AICPU_DEPLOY_DIR="$HCCL_VM_PATH/hccl_vm_install/lib/aarch64"
204 309 
205-# 3.拷贝并立即解压 - aicpu_hccl.tar.gz310+# 默认模式和 install 模式都要从 CANN 根解压,解压到工具目录
206-if [ "$BUILD_HCCL" = true ]; then311+if [ "$BUILD_HCCL" = true ] || [ "$MODE" = "deploy_only" ]; then
207- if [ -f "$HCCL_AICPU_TAR" ]; then312+ echo "部署 aicpu_hccl.tar.gz -> $AICPU_DEPLOY_DIR"
208- echo "正在解压 aicpu_hccl.tar.gz..."313+ deploy_aicpu_kernel_pkg "aicpu_hccl.tar.gz" "$ASCEND_HOME_PATH" "$INI_PATH" "$AICPU_DEPLOY_DIR"
209- tar -zxvf "$HCCL_AICPU_TAR" -C "$TARGET_DIR" --strip-components=1
210- else
211- echo "警告: aicpu_hccl.tar.gz 未找到 $HCCL_AICPU_TAR"
212- exit 1
213- fi
214else314else
215 echo "跳过 aicpu_hccl.tar.gz 处理..."315 echo "跳过 aicpu_hccl.tar.gz 处理..."
216fi316fi
217 317 
218-# 4.拷贝并立即解压 - aicpu_hcomm.tar.gz318+if [ "$BUILD_HCOMM" = true ] || [ "$MODE" = "deploy_only" ]; then
219-if [ "$BUILD_HCOMM" = true ]; then319+ echo "部署 aicpu_hcomm.tar.gz -> $AICPU_DEPLOY_DIR"
220- if [ -f "$HCOMM_AICPU_TAR" ]; then320+ deploy_aicpu_kernel_pkg "aicpu_hcomm.tar.gz" "$ASCEND_HOME_PATH" "$INI_PATH" "$AICPU_DEPLOY_DIR"
221- echo "正在解压 aicpu_hcomm.tar.gz..."
222- tar -zxvf "$HCOMM_AICPU_TAR" -C "$TARGET_DIR" --strip-components=1
223- else
224- echo "警告: aicpu_hccl.tar.gz 未找到 $HCOMM_AICPU_TAR"
225- exit 1
226- fi
227else321else
228 echo "跳过 aicpu_hcomm.tar.gz 处理..."322 echo "跳过 aicpu_hcomm.tar.gz 处理..."
229fi323fi
230 324 
231-sudo chmod -R 755 "$TARGET_DIR"325+# 修正目录和文件的权限,确保 .so 有足够权限被 dlopen 加载
326+sudo chmod -R 755 "$AICPU_DEPLOY_DIR"
232 327 
233echo "所有任务均已执行完成!"328echo "所有任务均已执行完成!"
@@ -0,0 +1,61 @@
1+include_guard(GLOBAL)
2+ 
3+set(CANN_CMAKE_VERSION_TAG "master-044")
4+set(CANN_CMAKE_URL "https://raw.gitcode.com/cann/cmake/archive/refs/heads/${CANN_CMAKE_VERSION_TAG}.tar.gz")
5+set(CANN_CMAKE_ARCHIVE_FILE "cmake-${CANN_CMAKE_VERSION_TAG}.tar.gz")
6+set(CANN_CMAKE_PKG_PATH ${CMAKE_SOURCE_DIR}/third_party/${CANN_CMAKE_ARCHIVE_FILE})
7+set(CANN_CMAKE_TARGET_DIR ${CMAKE_SOURCE_DIR}/third_party/cann-cmake)
8+set(CANN_CMAKE_SCRIPT ${CANN_CMAKE_TARGET_DIR}/scripts/signtool/image_extract/ci_img_headler.py)
9+ 
10+message(STATUS "[ThirdParty] CANN_CMAKE_VERSION_TAG=${CANN_CMAKE_VERSION_TAG}")
11+message(STATUS "[ThirdParty] CANN_CMAKE_URL=${CANN_CMAKE_URL}")
12+message(STATUS "[ThirdParty] CANN_CMAKE_TARGET_DIR=${CANN_CMAKE_TARGET_DIR}")
13+ 
14+if(EXISTS "${CANN_CMAKE_SCRIPT}")
15+ message(STATUS "[ThirdParty] cann-cmake already available in ${CANN_CMAKE_TARGET_DIR}")
16+else()
17+ if(NOT EXISTS "${CANN_CMAKE_PKG_PATH}")
18+ message(STATUS "[ThirdParty] Downloading cann-cmake from ${CANN_CMAKE_URL}")
19+ file(DOWNLOAD
20+ ${CANN_CMAKE_URL}
21+ ${CANN_CMAKE_PKG_PATH}
22+ STATUS _dl_status
23+ TIMEOUT 600
24+ )
25+ list(GET _dl_status 0 _dl_code)
26+ if(NOT _dl_code EQUAL 0)
27+ file(REMOVE "${CANN_CMAKE_PKG_PATH}")
28+ message(FATAL_ERROR
29+ "[ThirdParty] Failed to download cann-cmake archive (${_dl_status}).\n"
30+ "URL: ${CANN_CMAKE_URL}\n"
31+ "You can manually download and place at: ${CANN_CMAKE_PKG_PATH}")
32+ endif()
33+ message(STATUS "[ThirdParty] cann-cmake archive saved to ${CANN_CMAKE_PKG_PATH}")
34+ else()
35+ message(STATUS "[ThirdParty] Found local cann-cmake package: ${CANN_CMAKE_PKG_PATH}")
36+ endif()
37+ 
38+ set(_cann_cmake_extract_dir "${CMAKE_BINARY_DIR}/_cann_cmake_tmp")
39+ file(MAKE_DIRECTORY ${_cann_cmake_extract_dir})
40+ file(ARCHIVE_EXTRACT
41+ INPUT ${CANN_CMAKE_PKG_PATH}
42+ DESTINATION ${_cann_cmake_extract_dir}
43+ )
44+ file(GLOB _cann_cmake_extracted_entries "${_cann_cmake_extract_dir}/*")
45+ list(GET _cann_cmake_extracted_entries 0 _cann_cmake_extracted_dir)
46+ 
47+ if(EXISTS "${CANN_CMAKE_TARGET_DIR}")
48+ file(REMOVE_RECURSE ${CANN_CMAKE_TARGET_DIR})
49+ endif()
50+ file(RENAME ${_cann_cmake_extracted_dir} ${CANN_CMAKE_TARGET_DIR})
51+ file(REMOVE_RECURSE ${_cann_cmake_extract_dir})
52+ 
53+ if(NOT EXISTS "${CANN_CMAKE_SCRIPT}")
54+ message(FATAL_ERROR
55+ "[ThirdParty] cann-cmake extraction failed. "
56+ "Missing ${CANN_CMAKE_SCRIPT}")
57+ endif()
58+ message(STATUS "[ThirdParty] cann-cmake extracted to ${CANN_CMAKE_TARGET_DIR}")
59+endif()
60+ 
61+set(CANN_CMAKE_DIR "${CANN_CMAKE_TARGET_DIR}" CACHE PATH "Path to cann-cmake")
@@ -18,7 +18,6 @@ else()
18 file(DOWNLOAD18 file(DOWNLOAD
19 ${CLI11_URL}19 ${CLI11_URL}
20 ${CLI11_PKG_PATH}20 ${CLI11_PKG_PATH}
21- TLS_VERIFY OFF
22 STATUS _dl_status21 STATUS _dl_status
23 TIMEOUT 60022 TIMEOUT 600
24 )23 )
@@ -51,7 +51,6 @@ if(NOT gtest_FOUND)
51 ExternalProject_Add(third_party_gtest51 ExternalProject_Add(third_party_gtest
52 URL ${GTEST_PROJECT_URL}52 URL ${GTEST_PROJECT_URL}
53 URL_HASH SHA256=8ad598c73ad796e0d8280b082cebd82a630d73e73cd3c70057938a6501bba5d753 URL_HASH SHA256=8ad598c73ad796e0d8280b082cebd82a630d73e73cd3c70057938a6501bba5d7
54- TLS_VERIFY OFF
55 DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/third_party54 DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/third_party
56 DOWNLOAD_NO_PROGRESS TRUE55 DOWNLOAD_NO_PROGRESS TRUE
57 CONFIGURE_COMMAND ${CMAKE_COMMAND} ${GTEST_OPTS} <SOURCE_DIR>56 CONFIGURE_COMMAND ${CMAKE_COMMAND} ${GTEST_OPTS} <SOURCE_DIR>
@@ -19,7 +19,6 @@ else()
19 file(DOWNLOAD19 file(DOWNLOAD
20 ${NLOHMANN_JSON_URL}20 ${NLOHMANN_JSON_URL}
21 ${NLOHMANN_JSON_PKG_PATH}21 ${NLOHMANN_JSON_PKG_PATH}
22- TLS_VERIFY OFF
23 STATUS _dl_status22 STATUS _dl_status
24 TIMEOUT 60023 TIMEOUT 600
25 )24 )
@@ -19,7 +19,6 @@ if(NOT EXISTS "${SPDLOG_PKG_PATH}")
19 file(DOWNLOAD19 file(DOWNLOAD
20 ${SPDLOG_URL}20 ${SPDLOG_URL}
21 ${SPDLOG_PKG_PATH}21 ${SPDLOG_PKG_PATH}
22- TLS_VERIFY OFF
23 STATUS _dl_status22 STATUS _dl_status
24 TIMEOUT 60023 TIMEOUT 600
25 )24 )
@@ -10,33 +10,28 @@ message(STATUS "[ThirdParty] SQLITE3_VERSION_NUM=${SQLITE3_VERSION_NUM}")
10message(STATUS "[ThirdParty] SQLITE3_URL=${SQLITE3_URL}")10message(STATUS "[ThirdParty] SQLITE3_URL=${SQLITE3_URL}")
11message(STATUS "[ThirdParty] SQLITE3_TARGET_DIR=${SQLITE3_TARGET_DIR}")11message(STATUS "[ThirdParty] SQLITE3_TARGET_DIR=${SQLITE3_TARGET_DIR}")
12 12 
13-# 缓存命中:源码目录已存在13+# 缓存命中:源码目录已存在,跳过下载/解压;否则下载并解压
14-if(EXISTS "${SQLITE3_TARGET_DIR}/sqlite3.c" AND EXISTS "${SQLITE3_TARGET_DIR}/sqlite3.h")14+if(NOT (EXISTS "${SQLITE3_TARGET_DIR}/sqlite3.c" AND EXISTS "${SQLITE3_TARGET_DIR}/sqlite3.h"))
15- message(STATUS "[ThirdParty] SQLite3 source already available in ${SQLITE3_TARGET_DIR}")15+ # 获取 zip:优先用本地缓存,否则在线下载
16- return()16+ if(NOT EXISTS "${SQLITE3_PKG_PATH}")
17-endif()17+ message(STATUS "[ThirdParty] Downloading SQLite3 from ${SQLITE3_URL}")
18- 18+ file(DOWNLOAD
19-# 获取 zip:优先用本地缓存,否则在线下载19+ ${SQLITE3_URL}
20-if(NOT EXISTS "${SQLITE3_PKG_PATH}")20+ ${SQLITE3_PKG_PATH}
21- message(STATUS "[ThirdParty] Downloading SQLite3 from ${SQLITE3_URL}")21+ STATUS _dl_status
22- file(DOWNLOAD22+ TIMEOUT 600
23- ${SQLITE3_URL}23+ )
24- ${SQLITE3_PKG_PATH}24+ list(GET _dl_status 0 _dl_code)
25- TLS_VERIFY OFF25+ if(NOT _dl_code EQUAL 0)
26- STATUS _dl_status26+ message(FATAL_ERROR
27- TIMEOUT 60027+ "[ThirdParty] Failed to download SQLite3 archive (${_dl_status}).\n"
28- )28+ "URL: ${SQLITE3_URL}\n"
29- list(GET _dl_status 0 _dl_code)29+ "You can manually download and place the zip at: ${SQLITE3_PKG_PATH}")
30- if(NOT _dl_code EQUAL 0)30+ endif()
31- message(FATAL_ERROR31+ message(STATUS "[ThirdParty] SQLite3 archive saved to ${SQLITE3_PKG_PATH}")
32- "[ThirdParty] Failed to download SQLite3 archive (${_dl_status}).\n"32+ else()
33- "URL: ${SQLITE3_URL}\n"33+ message(STATUS "[ThirdParty] Found local SQLite3 package: ${SQLITE3_PKG_PATH}")
34- "You can manually download and place the zip at: ${SQLITE3_PKG_PATH}")
35 endif()34 endif()
36- message(STATUS "[ThirdParty] SQLite3 archive saved to ${SQLITE3_PKG_PATH}")
37-else()
38- message(STATUS "[ThirdParty] Found local SQLite3 package: ${SQLITE3_PKG_PATH}")
39-endif()
40 35 
41# 解压36# 解压
42set(_sqlite3_extract_dir "${CMAKE_BINARY_DIR}/_sqlite3_tmp")37set(_sqlite3_extract_dir "${CMAKE_BINARY_DIR}/_sqlite3_tmp")
@@ -62,3 +57,4 @@ if(NOT EXISTS "${SQLITE3_TARGET_DIR}/sqlite3.c" OR NOT EXISTS "${SQLITE3_TARGET_
62 "Missing sqlite3.c or sqlite3.h in ${SQLITE3_TARGET_DIR}")57 "Missing sqlite3.c or sqlite3.h in ${SQLITE3_TARGET_DIR}")
63endif()58endif()
64message(STATUS "[ThirdParty] SQLite3 source extracted to ${SQLITE3_TARGET_DIR}")59message(STATUS "[ThirdParty] SQLite3 source extracted to ${SQLITE3_TARGET_DIR}")
60+endif()
@@ -53,7 +53,6 @@ if(NOT yaml_cpp_FOUND)
53 include(ExternalProject)53 include(ExternalProject)
54 ExternalProject_Add(third_party_yaml_cpp54 ExternalProject_Add(third_party_yaml_cpp
55 URL ${YAMLCPP_PROJECT_URL}55 URL ${YAMLCPP_PROJECT_URL}
56- TLS_VERIFY OFF
57 DOWNLOAD_EXTRACT_TIMESTAMP TRUE56 DOWNLOAD_EXTRACT_TIMESTAMP TRUE
58 DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/third_party57 DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/third_party
59 DOWNLOAD_NO_PROGRESS TRUE58 DOWNLOAD_NO_PROGRESS TRUE
@@ -65,6 +65,7 @@ CANN_SETENV="" # detect_cann 写入:对应的 set_env.sh 全路
65CANN_TARGET="" # 解析出的安装目标目录(决定下载/覆盖时由 resolve_cann_target 赋值)65CANN_TARGET="" # 解析出的安装目标目录(决定下载/覆盖时由 resolve_cann_target 赋值)
66CANN_CACHE="" # 下载缓存目录,apply_defaults 里赋 ${WORKSPACE}/.cann-download66CANN_CACHE="" # 下载缓存目录,apply_defaults 里赋 ${WORKSPACE}/.cann-download
67CANN_RUN_FILE="" # 实际下载到的 .run 文件全路径(收尾展示用)67CANN_RUN_FILE="" # 实际下载到的 .run 文件全路径(收尾展示用)
68+OPS_RUN_FILE="" # 实际下载到的 ops 包全路径(收尾展示用)
68CANN_CHANNEL="master" # CANN 镜像下载通道,apply_defaults 按 profile 落定(campus=legacy / main=master)69CANN_CHANNEL="master" # CANN 镜像下载通道,apply_defaults 按 profile 落定(campus=legacy / main=master)
69HCCL_TEST_RESULT="" # build_hccl_test 写入:built | skipped | failed:<原因>70HCCL_TEST_RESULT="" # build_hccl_test 写入:built | skipped | failed:<原因>
70HCCL_TEST_BIN_DIR="" # build_hccl_test 写入:hccl_test 可执行文件所在目录(原地编译)71HCCL_TEST_BIN_DIR="" # build_hccl_test 写入:hccl_test 可执行文件所在目录(原地编译)
@@ -129,6 +130,7 @@ success_summary() {
129 *) : ;;130 *) : ;;
130 esac131 esac
131 [ -n "${CANN_RUN_FILE}" ] && info "CANN 安装包(已保留): ${CANN_RUN_FILE}"132 [ -n "${CANN_RUN_FILE}" ] && info "CANN 安装包(已保留): ${CANN_RUN_FILE}"
133+ [ -n "${OPS_RUN_FILE:-}" ] && info "CANN ops 包(已保留): ${OPS_RUN_FILE}"
132 local inst="${CHECKER_PATH}/hccl_vm_install"134 local inst="${CHECKER_PATH}/hccl_vm_install"
133 local setenv="${ASCEND_HOME_PATH:-<CANN>/ascend-toolkit}/set_env.sh"135 local setenv="${ASCEND_HOME_PATH:-<CANN>/ascend-toolkit}/set_env.sh"
134 local mpirun_extra=""136 local mpirun_extra=""
@@ -197,13 +199,13 @@ normalize_arch() {
197# ── Profile 注册表:一个 profile 只映射 hcomm/hccl 分支;首行为默认;新增版本加一行即可 ──199# ── Profile 注册表:一个 profile 只映射 hcomm/hccl 分支;首行为默认;新增版本加一行即可 ──
198# 每行格式:hcomm_ref|hccl_ref|说明200# 每行格式:hcomm_ref|hccl_ref|说明
199profile_all_names() {201profile_all_names() {
200- printf '%s\n' "campus-2026" "main"202+ printf '%s\n' "main" "campus-2026"
201}203}
202# 每行格式:hcomm_ref|hccl_ref|说明|是否允许 weekly|CANN 下载通道(master=滚动最新 / legacy=归档)204# 每行格式:hcomm_ref|hccl_ref|说明|是否允许 weekly|CANN 下载通道(master=滚动最新 / legacy=归档)
203profile_row() {205profile_row() {
204 case "$1" in206 case "$1" in
205- campus-2026) echo "competition/campus-2026|competition/campus-2026|竞赛固定,CANN 从 build.md 提取|false|legacy" ;;
206 main) echo "master|master|主线最新,随官方更新|true|master" ;;207 main) echo "master|master|主线最新,随官方更新|true|master" ;;
208+ campus-2026) echo "competition/campus-2026|competition/campus-2026|竞赛固定,CANN 从 build.md 提取|false|legacy" ;;
207 *) return 1 ;;209 *) return 1 ;;
208 esac210 esac
209}211}
@@ -235,7 +237,7 @@ show_help() {
235 echo " bash hccl_vm_installer [选项]"237 echo " bash hccl_vm_installer [选项]"
236 echo ""238 echo ""
237 echo "常用选项:"239 echo "常用选项:"
238- echo " --profile <名称> 配套方案,默认: campus-2026竞赛固定)"240+ echo " --profile <名称> 配套方案,默认: main主线最新)"
239 echo " --list-profiles 查看所有可选配套方案"241 echo " --list-profiles 查看所有可选配套方案"
240 echo " --workspace <路径> 工作目录 (默认: 当前目录)"242 echo " --workspace <路径> 工作目录 (默认: 当前目录)"
241 echo " --ascend-path <路径> 指定 CANN 目录:有则复用、没有则装到这里(不指定时探测 <工作目录>/Ascend)"243 echo " --ascend-path <路径> 指定 CANN 目录:有则复用、没有则装到这里(不指定时探测 <工作目录>/Ascend)"
@@ -837,6 +839,22 @@ pick_toolkit_file() {
837 echo "${file}"839 echo "${file}"
838}840}
839 841 
842+# $1=快照号 $2=是否允许 weekly(true=主线 profile;否则只取正式发布版)
843+pick_ops_file() {
844+ local snap="$1" allow_weekly="${2:-false}" base all file arch
845+ arch="$(normalize_arch "$(uname -m)" 2>/dev/null || echo x86_64)"
846+ base="https://ascend.devcloud.huaweicloud.com/artifactory/cann-run-mirror/software/${CANN_CHANNEL}/${snap}"
847+ all="$(curl -fsSL "${base}/" 2>/dev/null | grep -oE "Ascend-cann-950-ops_[^\"< ]*linux-${arch}\\.run" | sort -u)" || true
848+ if [ "${allow_weekly}" = true ]; then
849+ file="$(printf '%s\n' "${all}" | grep -i weekly | sort -V | tail -1)"
850+ [ -n "${file}" ] || file="$(printf '%s\n' "${all}" | sort -V | tail -1)"
851+ else
852+ file="$(printf '%s\n' "${all}" | grep -E "^Ascend-cann-950-ops_[0-9]+(\\.[0-9]+)*_linux-${arch}\\.run$" | sort -V | tail -1)"
853+ fi
854+ [ -n "${file}" ] || return 1
855+ echo "${file}"
856+}
857+ 
840detect_cann() {858detect_cann() {
841 CANN_INSTALLED=""; CANN_SETENV=""859 CANN_INSTALLED=""; CANN_SETENV=""
842 local cand se860 local cand se
@@ -1111,6 +1129,69 @@ download_and_install_cann() {
1111 CANN_RUN_FILE="${CANN_CACHE}/${file}"1129 CANN_RUN_FILE="${CANN_CACHE}/${file}"
1112}1130}
1113 1131 
1132+# $1=安装目标 <target>
1133+# 下载并安装 CANN ops 算子包(与 toolkit 安装策略一致,失败则退出)
1134+download_and_install_cann_ops() {
1135+ local target="$1"
1136+ # 1. 幂等检查(ops 包已装则跳过)
1137+ if [ -d "${target}/ascend-toolkit/latest/ops" ] || [ -d "${target}/ops" ]; then
1138+ info "检测到 ops 包已安装:${target},跳过下载"
1139+ return 0
1140+ fi
1141+ 
1142+ # 2. 选择 ops 包
1143+ local snap; snap="$(pick_cann_snapshot "" || true)"
1144+ [ -n "${snap}" ] || { warn "无法确定 CANN 快照。"; print_cann_guidance; exit 1; }
1145+ 
1146+ local aw; aw="$(profile_allow_weekly "${PROFILE}")"
1147+ local file; file="$(pick_ops_file "${snap}" "${aw}")" || true
1148+ local _arch_for_msg
1149+ _arch_for_msg="$(normalize_arch "$(uname -m)" 2>/dev/null || echo x86_64)"
1150+ [ -n "${file}" ] || { warn "快照目录 ${snap} 未找到可用的 ${_arch_for_msg} ops 包(当前 profile=${PROFILE}$([ "${aw}" = true ] || echo ',仅取正式发布版、不取 weekly'))。"; print_cann_guidance; exit 1; }
1151+ 
1152+ # 3. 下载(缓存逻辑同 toolkit)
1153+ local base="https://ascend.devcloud.huaweicloud.com/artifactory/cann-run-mirror/software/${CANN_CHANNEL}/${snap}"
1154+ local url="${base}/${file}" total
1155+ local dl_log="${LOG_DIR}/ops-download-${RUN_TS}.log"
1156+ mkdir -p "${CANN_CACHE}" "${LOG_DIR}" || { warn "无法创建缓存/日志目录"; print_cann_guidance; exit 1; }
1157+ total="$(curl -fsSI "${url}" 2>/dev/null | tr -d '\r' | awk 'tolower($1)=="content-length:"{print $2}' | tail -1)" || true
1158+ 
1159+ if [ -f "${CANN_CACHE}/${file}" ] && [ -n "${total}" ] \
1160+ && [ "$(stat -c%s "${CANN_CACHE}/${file}" 2>/dev/null || echo 0)" = "${total}" ]; then
1161+ info "复用已下载的 ops 包(${CANN_CACHE}/${file},$(( total / 1024 / 1024 ))M),跳过下载"
1162+ else
1163+ info "下载 ops 包..."
1164+ local attempt=1
1165+ while :; do
1166+ wget -q -O "${CANN_CACHE}/${file}" "${url}" </dev/null 2>>"${dl_log}" &
1167+ local dpid=$!
1168+ spin_on_pid_pct "${dpid}" "下载 ops" "${total:-0}" "${CANN_CACHE}/${file}"
1169+ if wait "${dpid}" && { [ -z "${total}" ] || [ "$(stat -c%s "${CANN_CACHE}/${file}" 2>/dev/null || echo 0)" = "${total}" ]; }; then
1170+ break
1171+ fi
1172+ rm -f "${CANN_CACHE}/${file}" || true
1173+ if [ "${attempt}" -ge 2 ]; then
1174+ warn "ops 包下载失败,末尾日志:"; tail -n 20 "${dl_log}" >&2
1175+ echo " 请检查网络/代理/防火墙;持续失败可带日志到 https://gitcode.com/cann/hcomm/issues 反馈。" >&2
1176+ print_cann_guidance; exit 1
1177+ fi
1178+ warn "ops 包下载失败,3 秒后重试一次……"; attempt=2; sleep 3 || true
1179+ done
1180+ fi
1181+ 
1182+ # 4. 安装(安装到同一 target 目录)
1183+ local inst_log="${LOG_DIR}/ops-install-${RUN_TS}.log"
1184+ if ! chmod +x "${CANN_CACHE}/${file}"; then warn "无法给安装包加执行权限:${CANN_CACHE}/${file}"; print_cann_guidance; exit 1; fi
1185+ if ! LANG=C.UTF-8 LC_ALL=C.UTF-8 "${CANN_CACHE}/${file}" --install --install-path="${target}" --quiet </dev/null >>"${inst_log}" 2>&1; then
1186+ warn "ops 包安装失败,末尾日志:"; tail -n 20 "${inst_log}" >&2
1187+ print_cann_guidance; exit 1
1188+ fi
1189+ 
1190+ OPS_RUN_FILE="${CANN_CACHE}/${file}"
1191+ info "ops 包安装完成:${file}"
1192+ return 0
1193+}
1194+ 
1114# 第 5 步:复用第 1 步写好的 CANN_INSTALLED/CANN_SETENV,按四情况处理。$1=build.md 快照(可空)1195# 第 5 步:复用第 1 步写好的 CANN_INSTALLED/CANN_SETENV,按四情况处理。$1=build.md 快照(可空)
1115resolve_cann() {1196resolve_cann() {
1116 local snapshot="$1"1197 local snapshot="$1"
@@ -1129,11 +1210,13 @@ resolve_cann() {
1129 warn "已按 --offline 保留现有 CANN;请自行确认其与所需配套版本一致。" ;;1210 warn "已按 --offline 保留现有 CANN;请自行确认其与所需配套版本一致。" ;;
1130 download)1211 download)
1131 resolve_cann_target "${CANN_INSTALLED}"1212 resolve_cann_target "${CANN_INSTALLED}"
1132- download_and_install_cann "${CANN_TARGET}" "${snapshot}" ;;1213+ download_and_install_cann "${CANN_TARGET}" "${snapshot}"
1214+ download_and_install_cann_ops "${CANN_TARGET}" ;;
1133 auto)1215 auto)
1134 resolve_cann_target "${CANN_INSTALLED}"1216 resolve_cann_target "${CANN_INSTALLED}"
1135 if { [ -t 0 ] || [ -e /dev/tty ]; } && prompt_yn "下载配套版并覆盖升级 ${CANN_TARGET} 的现有 CANN? 15 秒内无响应视为保留。[y/N]" N; then1217 if { [ -t 0 ] || [ -e /dev/tty ]; } && prompt_yn "下载配套版并覆盖升级 ${CANN_TARGET} 的现有 CANN? 15 秒内无响应视为保留。[y/N]" N; then
1136 download_and_install_cann "${CANN_TARGET}" "${snapshot}"1218 download_and_install_cann "${CANN_TARGET}" "${snapshot}"
1219+ download_and_install_cann_ops "${CANN_TARGET}"
1137 else1220 else
1138 warn "保留现有 CANN(未覆盖);如需覆盖请加 --reinstall-cann。"1221 warn "保留现有 CANN(未覆盖);如需覆盖请加 --reinstall-cann。"
1139 fi ;;1222 fi ;;
@@ -1142,6 +1225,7 @@ resolve_cann() {
1142 else1225 else
1143 info "下载 CANN ${snapshot} 并安装到 ${CANN_TARGET}"1226 info "下载 CANN ${snapshot} 并安装到 ${CANN_TARGET}"
1144 download_and_install_cann "${CANN_TARGET}" "${snapshot}"1227 download_and_install_cann "${CANN_TARGET}" "${snapshot}"
1228+ download_and_install_cann_ops "${CANN_TARGET}"
1145 fi1229 fi
1146 # ASCEND_HOME_PATH 兜底:从 ASCEND_TOOLKIT_HOME 或探测到的 CANN 目录推导1230 # ASCEND_HOME_PATH 兜底:从 ASCEND_TOOLKIT_HOME 或探测到的 CANN 目录推导
1147 if [ -z "${ASCEND_HOME_PATH:-}" ]; then1231 if [ -z "${ASCEND_HOME_PATH:-}" ]; then
@@ -1209,7 +1293,7 @@ build_hccl_vm() {
1209 fi1293 fi
1210}1294}
1211 1295 
1212-# 编译安装 HCCL/HCOMM 子包(使用 hcomm 仓库自带的 build_pkg.sh)1296+# 执行 build_pkg.sh 获得aicpu在device侧的符号(使用 hcomm 仓库自带的 build_pkg.sh)
1213# build_pkg.sh 位于 CHECKER_PATH(即 hcomm/test/hccl_vm/)下,步骤 4 已 clone 完成1297# build_pkg.sh 位于 CHECKER_PATH(即 hcomm/test/hccl_vm/)下,步骤 4 已 clone 完成
1214# 需要以下环境变量:1298# 需要以下环境变量:
1215# ASCEND_HOME_PATH - CANN 安装目录(source CANN set_env.sh 后导出)1299# ASCEND_HOME_PATH - CANN 安装目录(source CANN set_env.sh 后导出)
@@ -1217,7 +1301,7 @@ build_hccl_vm() {
1217# HCOMM_CODE_HOME - hcomm 源码目录(build_hccl_vm 已导出)1301# HCOMM_CODE_HOME - hcomm 源码目录(build_hccl_vm 已导出)
1218# 通过 --tool_path 传入 checker 安装路径(即 CHECKER_PATH)1302# 通过 --tool_path 传入 checker 安装路径(即 CHECKER_PATH)
1219build_hcomm_hccl_pkg() {1303build_hcomm_hccl_pkg() {
1220- info "编译安装 HCCL/HCOMM 子包..."1304+ info "执行 build_pkg.sh 获得 aicpu 运行在 device 侧的符号..."
1221 local pkg_script="${CHECKER_PATH}/build_pkg.sh"1305 local pkg_script="${CHECKER_PATH}/build_pkg.sh"
1222 local pkg_log="${LOG_DIR}/build-pkg-${RUN_TS}.log"1306 local pkg_log="${LOG_DIR}/build-pkg-${RUN_TS}.log"
1223 1307 
@@ -1232,22 +1316,22 @@ build_hcomm_hccl_pkg() {
1232 if [ "${VERBOSE}" = true ]; then1316 if [ "${VERBOSE}" = true ]; then
1233 bash "${pkg_script}" --tool_path "${CHECKER_PATH}" 2>&1 | tee "${pkg_log}" || rc=${PIPESTATUS[0]}1317 bash "${pkg_script}" --tool_path "${CHECKER_PATH}" 2>&1 | tee "${pkg_log}" || rc=${PIPESTATUS[0]}
1234 else1318 else
1235- info "开始编译子包,预计数分钟。实时日志: tail -f ${pkg_log}"1319+ info "开始执行 build_pkg.sh。实时日志: tail -f ${pkg_log}"
1236 bash "${pkg_script}" --tool_path "${CHECKER_PATH}" > "${pkg_log}" 2>&1 &1320 bash "${pkg_script}" --tool_path "${CHECKER_PATH}" > "${pkg_log}" 2>&1 &
1237 local pkg_pid=$!1321 local pkg_pid=$!
1238 spin_on_pid "${pkg_pid}" "编译子包中"1322 spin_on_pid "${pkg_pid}" "编译子包中"
1239 wait "${pkg_pid}" || rc=$?1323 wait "${pkg_pid}" || rc=$?
1240 fi1324 fi
1241 if [ "${rc}" -ne 0 ]; then1325 if [ "${rc}" -ne 0 ]; then
1242- warn "HCCL/HCOMM 子包编译失败,末尾日志:"1326+ warn "执行 build_pkg.sh 失败,末尾日志:"
1243 tail -n 20 "${pkg_log}" >&21327 tail -n 20 "${pkg_log}" >&2
1244 echo " 完整日志: ${pkg_log}" >&21328 echo " 完整日志: ${pkg_log}" >&2
1245 echo " 若为第三方库下载失败(网络/SSL):已清理下载缓存,重跑即可重新下载;若为 gcc 超出 build.md 前置依赖范围(7.3.0–13.3.x)请在满足该范围的环境(如 22.04/24.04)运行。" >&21329 echo " 若为第三方库下载失败(网络/SSL):已清理下载缓存,重跑即可重新下载;若为 gcc 超出 build.md 前置依赖范围(7.3.0–13.3.x)请在满足该范围的环境(如 22.04/24.04)运行。" >&2
1246 echo " 也可手动执行: bash ${pkg_script} --tool_path ${CHECKER_PATH}" >&21330 echo " 也可手动执行: bash ${pkg_script} --tool_path ${CHECKER_PATH}" >&2
1247 clean_thirdparty_dl_cache1331 clean_thirdparty_dl_cache
1248- error "子包编译未通过,请检查日志后重试。"1332+ error "执行 build_pkg.sh 失败,请检查日志后重试。"
1249 fi1333 fi
1250- info "HCCL/HCOMM 子包编译安装完成!"1334+ info "执行 build_pkg.sh 完成!"
1251}1335}
1252 1336 
1253# 按 README §4.7 准备 /etc/hccl_rootinfo.json:HCCL 初始化通信域时从该文件读 topo.json 路径,1337# 按 README §4.7 准备 /etc/hccl_rootinfo.json:HCCL 初始化通信域时从该文件读 topo.json 路径,
@@ -1265,7 +1349,7 @@ setup_hccl_rootinfo() {
1265 fi1349 fi
1266}1350}
1267 1351 
1268-# 第 9 步:编译 hccl_test(增值步骤,失败只 WARN 不阻断)。前提:build_hcomm_hccl_pkg 已把 libhccl 装进 CANN。1352+# 第 9 步:编译 hccl_test(增值步骤,失败只 WARN 不阻断)。
1269build_hccl_test() {1353build_hccl_test() {
1270 if [ "${SKIP_HCCL_TEST}" = true ]; then1354 if [ "${SKIP_HCCL_TEST}" = true ]; then
1271 HCCL_TEST_RESULT="skipped"1355 HCCL_TEST_RESULT="skipped"
@@ -1541,7 +1625,7 @@ main() {
1541 clone_repo "hccl" "https://gitcode.com/cann/hccl.git" "${HCCL_REF}" "${HCCL_PATH}"1625 clone_repo "hccl" "https://gitcode.com/cann/hccl.git" "${HCCL_REF}" "${HCCL_PATH}"
1542 step 7 "${STEP_TOTAL}" "编译 HCCL-VM"1626 step 7 "${STEP_TOTAL}" "编译 HCCL-VM"
1543 build_hccl_vm1627 build_hccl_vm
1544- step 8 "${STEP_TOTAL}" "编译安装 HCCL/HCOMM 子包"1628+ step 8 "${STEP_TOTAL}" "解析 aicpu_hcxx.tar.gz 得到 device 侧符号"
1545 build_hcomm_hccl_pkg1629 build_hcomm_hccl_pkg
1546 step 9 "${STEP_TOTAL}" "编译 hccl_test"1630 step 9 "${STEP_TOTAL}" "编译 hccl_test"
1547 build_hccl_test1631 build_hccl_test
@@ -21,7 +21,7 @@ namespace sim {
21aclError GetDeviceByLogicId(uint32_t deviceId, sim::Device &device);21aclError GetDeviceByLogicId(uint32_t deviceId, sim::Device &device);
22aclError GetDeviceByRankId(uint32_t rankId, sim::Device &device);22aclError GetDeviceByRankId(uint32_t rankId, sim::Device &device);
23aclError GetDeviceByPhysicalId(uint32_t deviceId, sim::Device &device);23aclError GetDeviceByPhysicalId(uint32_t deviceId, sim::Device &device);
24-aclError UpdateDeviceLogicId(uint64_t serverKey, uint32_t phyDevId, uint32_t logicDevId);24+aclError UpdateDeviceLogicId(uint64_t serverKey, uint32_t phyDevId, uint32_t logicDevId, uint32_t userId);
25aclError UpdateSuperDeviceId(uint32_t logicDevId, uint32_t superDeviceId);25aclError UpdateSuperDeviceId(uint32_t logicDevId, uint32_t superDeviceId);
26aclError GetCcuFromDeviceByDieId(uint64_t deviceKey, uint8_t dieId, sim::Ccu &ccu);26aclError GetCcuFromDeviceByDieId(uint64_t deviceKey, uint8_t dieId, sim::Ccu &ccu);
27aclError GetCcuResourceByCcu(uint64_t ccuKey, sim::CcuResource &ccuRes);27aclError GetCcuResourceByCcu(uint64_t ccuKey, sim::CcuResource &ccuRes);
@@ -50,6 +50,7 @@ typedef struct {
50typedef struct {50typedef struct {
51 uint64_t id; // PK51 uint64_t id; // PK
52 uint32_t server_id; // FK52 uint32_t server_id; // FK
53+ uint32_t user_id{0xFFFF};
53 uint32_t logic_id{0xFFFF};54 uint32_t logic_id{0xFFFF};
54 uint32_t physical_id;55 uint32_t physical_id;
55 uint32_t super_device_id;56 uint32_t super_device_id;
@@ -12,6 +12,7 @@
12#define SIM_COMMON_API_H12#define SIM_COMMON_API_H
13 13 
14#include <string>14#include <string>
15+#include "hccl/hccl_types.h"
15 16 
16class InstallPath {17class InstallPath {
17public:18public:
@@ -26,4 +27,8 @@ public:
26 static std::string ResolveToInstallRoot(const std::string& relPath);27 static std::string ResolveToInstallRoot(const std::string& relPath);
27};28};
28 29 
30+std::string GetDataTypeStr(HcclDataType type);
31+ 
32+std::string GetReduceOpStr(HcclReduceOp op);
33+ 
29#endif // SIM_COMMON_API_H34#endif // SIM_COMMON_API_H
@@ -30,7 +30,7 @@ public:
30 30 
31 int ReleaseCommMem(const char* name);31 int ReleaseCommMem(const char* name);
32 32 
33- int WriteCommMem(const char* name, const void* dataPtr, size_t size);33+ int64_t WriteCommMem(const char* name, const void* dataPtr, size_t size);
34 34 
35 int ReadCommMem(const char* name, void* dataPtr, size_t size);35 int ReadCommMem(const char* name, void* dataPtr, size_t size);
36 36 
@@ -62,7 +62,7 @@ private:
62 ~AscendClusterTopoParser() = default;62 ~AscendClusterTopoParser() = default;
63private:63private:
64 HcclVmResult InitClusterStaticTopoData();64 HcclVmResult InitClusterStaticTopoData();
65- HcclVmResult InitDynamicModelData(uint64_t serverKey, uint32_t rankId, uint32_t logicDevId, uint32_t phyDevId);65+ HcclVmResult InitDynamicModelData(const TopoMeta& topoMeta);
66 HcclVmResult BuildLevelList(const Server &server, int srcDevPhyId,66 HcclVmResult BuildLevelList(const Server &server, int srcDevPhyId,
67 const std::set<int> &commDomainLocalIds,67 const std::set<int> &commDomainLocalIds,
68 uint32_t spIdx, uint32_t srvIdx,68 uint32_t spIdx, uint32_t srvIdx,
@@ -1047,9 +1047,13 @@ HcclVmResult ClearDbTables()
1047 return HcclVmResult::HCCL_SIM_HOST_SUCCESS_CMD; 1047 return HcclVmResult::HCCL_SIM_HOST_SUCCESS_CMD;
1048} 1048}
1049 1049 
1050+extern uint64_t g_cur_server_key;
1051+ 
1050HcclVmResult HcclVmResetCommDomain() 1052HcclVmResult HcclVmResetCommDomain()
1051{ 1053{
1052 AscendClusterTopoParser::GetInstance().SetClusterStatus(HvmClusterStatus::COMM_DOMAIN_UNINIT); 1054 AscendClusterTopoParser::GetInstance().SetClusterStatus(HvmClusterStatus::COMM_DOMAIN_UNINIT);
1055+ // 重置 Host 进程中缓存的 server key,防止跨用例残留
1056+ g_cur_server_key = 0;
1053 // 重置device的逻辑ID 1057 // 重置device的逻辑ID
1054 auto ret2 = sim::ResetAllDeviceLogicId(); 1058 auto ret2 = sim::ResetAllDeviceLogicId();
1055 if (!ret2) { 1059 if (!ret2) {
@@ -37,9 +37,9 @@ void CmdTableShow(std::string &tableName)
37{37{
38 if (tableName == "Device") {38 if (tableName == "Device") {
39 auto tables = RunnerDB::GetByPred<sim::Device>([](auto &&) { return true; });39 auto tables = RunnerDB::GetByPred<sim::Device>([](auto &&) { return true; });
40- PrintTable<sim::Device>("| id | server_id | logic_id | physical_id | super_device_id | overflow_mode | soc_version | status |",40+ PrintTable<sim::Device>("| id | server_id | user_id | logic_id | physical_id | super_device_id | overflow_mode | soc_version | status |",
41 tables, [](const sim::Device &d) {41 tables, [](const sim::Device &d) {
42- return "| " + std::to_string(d.id) + " | " + std::to_string(d.server_id) + " | " +42+ return "| " + std::to_string(d.id) + " | " + std::to_string(d.server_id) + " | " + std::to_string(d.user_id) + " | " +
43 std::to_string(d.logic_id) + " | " + std::to_string(d.physical_id) + " | " +43 std::to_string(d.logic_id) + " | " + std::to_string(d.physical_id) + " | " +
44 std::to_string(d.super_device_id) + " | " +44 std::to_string(d.super_device_id) + " | " +
45 std::to_string(d.overflow_mode) + " | " + std::string(d.soc_version) +45 std::to_string(d.overflow_mode) + " | " + std::string(d.soc_version) +
@@ -77,10 +77,6 @@ target_link_libraries(device PRIVATE
77)77)
78 78 
79target_include_directories(device PRIVATE79target_include_directories(device PRIVATE
80- ${HCCL_CODE_ROOT}/src/ops/op_common/inc
81- ${HCCL_CODE_ROOT}/src/common
82- ${HCCL_CODE_ROOT}/src/common/hcomm_dlsym
83- ${HCCL_CODE_ROOT}/src/common/hcomm_dlsym/ccu
84 ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc80 ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc
85 ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc/hccl81 ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc/hccl
86 ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/include82 ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/include
@@ -20,6 +20,7 @@
20#include <nlohmann_json/json.hpp>20#include <nlohmann_json/json.hpp>
21#include <string>21#include <string>
22#include <sys/file.h>22#include <sys/file.h>
23+#include <sys/stat.h>
23#include <thread>24#include <thread>
24#include <unistd.h>25#include <unistd.h>
25 26 
@@ -240,6 +241,14 @@ void init_lock() {
240 HCCL_VM_ERROR("Failed to open lock file: {}", strerror(errno));241 HCCL_VM_ERROR("Failed to open lock file: {}", strerror(errno));
241 exit(1);242 exit(1);
242 }243 }
244+ 
245+ // open() 的创建权限会受 umask 影响,显式恢复为所有用户可读写。
246+ if (fchmod(fd, 0666) == -1 && errno != EPERM) {
247+ HCCL_VM_ERROR("Failed to set lock file permissions: {}", strerror(errno));
248+ close(fd);
249+ exit(1);
250+ }
251+ 
243 if (flock(fd, LOCK_EX | LOCK_NB) == -1) {252 if (flock(fd, LOCK_EX | LOCK_NB) == -1) {
244 if (errno == EWOULDBLOCK) {253 if (errno == EWOULDBLOCK) {
245 HCCL_VM_ERROR("Another instance of runner is already running. Exiting.");254 HCCL_VM_ERROR("Another instance of runner is already running. Exiting.");
@@ -255,9 +264,9 @@ int main(int argc, char* argv[])
255{264{
256 (void) argc;265 (void) argc;
257 (void) argv;266 (void) argv;
258- init_lock();
259 LogConfig config = LoadLogConfig("runner");267 LogConfig config = LoadLogConfig("runner");
260 InitLogger(config);268 InitLogger(config);
269+ init_lock();
261 HcclSim::StorageManager& storage = HcclSim::StorageManager::GetInstance();270 HcclSim::StorageManager& storage = HcclSim::StorageManager::GetInstance();
262 storage.SetDataId("runner");271 storage.SetDataId("runner");
263 272 
@@ -80,7 +80,24 @@ aclError aclrtSetDevice(int32_t deviceId)
80 uint64_t servId = 0;80 uint64_t servId = 0;
81 if (!sim::GetRankIdByMPI(rankId, servId)) {81 if (!sim::GetRankIdByMPI(rankId, servId)) {
82 HCCL_VM_ERROR("get rankId by MPI fail servId:{:d}", servId);82 HCCL_VM_ERROR("get rankId by MPI fail servId:{:d}", servId);
83- return 0;83+ return ACL_ERROR_INVALID_PARAM;
84+ }
85+ 
86+ // 查询 Rank 表,获取该 rankId 期望的 device
87+ auto rankEntry = RunnerDB::GetOneByPred<sim::Rank>([rankId](const sim::Rank &r) {
88+ return r.rank_id == rankId;
89+ });
90+ if (rankEntry.second) {
91+ auto rankDevice = RunnerDB::GetById<sim::Device>(rankEntry.first.device_id);
92+ if (rankDevice.has_value() && rankDevice->logic_id != (uint32_t)deviceId) {
93+ HCCL_VM_ERROR(
94+ "Rank-to-device mismatch detected! rank {} expected logicId={}, "
95+ "but application called aclrtSetDevice({}). "
96+ "This may indicate the MPI scheduling strategy has changed. "
97+ "Please verify your MPI launch configuration (e.g., hostfile order, "
98+ "scheduling policy) matches the round-robin convention assumed by ranktable.json.",
99+ rankId, rankDevice->logic_id, deviceId);
100+ }
84 }101 }
85 102 
86 sim::Device device{};103 sim::Device device{};
@@ -92,7 +109,6 @@ aclError aclrtSetDevice(int32_t deviceId)
92 return ACL_ERROR_INVALID_PARAM;109 return ACL_ERROR_INVALID_PARAM;
93 }110 }
94 device = ret.first;111 device = ret.first;
95- HCCL_VM_DEBUG("logicId:{:d} serverId:{:d} key:{:d}", device.logic_id, serverId, device.id);
96 112 
97 uint64_t deviceKey = device.id;113 uint64_t deviceKey = device.id;
98 SetDevIdPayload payload{};114 SetDevIdPayload payload{};
@@ -876,6 +892,12 @@ rtError_t rtReleaseDevResAddress(rtDevResInfo * const resInfo)
876 return ACL_SUCCESS;892 return ACL_SUCCESS;
877}893}
878 894 
895+aclError aclrtGetLogicDevIdByUserDevId(const int32_t userDevid, int32_t *const logicDevId)
896+{
897+ *logicDevId = userDevid;
898+ return ACL_SUCCESS;
899+}
900+ 
879#ifdef __cplusplus901#ifdef __cplusplus
880}902}
881#endif // __cplusplus903#endif // __cplusplus
@@ -30,10 +30,25 @@ message(STATUS "HCCL_CODE_ROOT: ${HCCL_CODE_ROOT}")
30set(AIV_KERNEL_DIR ${CMAKE_CURRENT_SOURCE_DIR})30set(AIV_KERNEL_DIR ${CMAKE_CURRENT_SOURCE_DIR})
31MESSAGE(STATUS "AIV_KERNEL_DIR: " ${AIV_KERNEL_DIR})31MESSAGE(STATUS "AIV_KERNEL_DIR: " ${AIV_KERNEL_DIR})
32 32 
33+set(HCCL_AIV_DEFINES
34+ ${HCCL_CODE_ROOT}/src/ops/op_common/template/aiv/aiv_defines.h)
35+if(NOT EXISTS ${HCCL_AIV_DEFINES})
36+ message(FATAL_ERROR "HCCL aiv_defines.h not found: ${HCCL_AIV_DEFINES}")
37+endif()
38+ 
39+set(AIV_SHADOW_DIR ${CMAKE_CURRENT_BINARY_DIR}/hccl_shadow)
40+file(MAKE_DIRECTORY ${AIV_SHADOW_DIR})
41+file(CREATE_LINK
42+ ${HCCL_AIV_DEFINES}
43+ ${AIV_SHADOW_DIR}/aiv_defines.h
44+ SYMBOLIC)
45+message(STATUS "AIV_SHADOW_DIR: ${AIV_SHADOW_DIR}")
46+ 
33set(AIV_KERNEL_STUB_INCLUDE_LIST47set(AIV_KERNEL_STUB_INCLUDE_LIST
34 ${AIV_KERNEL_DIR}/aiv_mode_stub48 ${AIV_KERNEL_DIR}/aiv_mode_stub
35 ${AIV_KERNEL_DIR}/ascendc_stub49 ${AIV_KERNEL_DIR}/ascendc_stub
36 ${AIV_KERNEL_DIR}/hccl_op_stub50 ${AIV_KERNEL_DIR}/hccl_op_stub
51+ ${AIV_SHADOW_DIR}
37 52 
38 ${HCCL_VM_INCLUDE}53 ${HCCL_VM_INCLUDE}
39 54 
@@ -41,6 +56,7 @@ set(AIV_KERNEL_STUB_INCLUDE_LIST
41 ${THRID_PARTY_DIR}/nlohmann_json56 ${THRID_PARTY_DIR}/nlohmann_json
42 ${THRID_PARTY_DIR}/dbg_macro # for debug57 ${THRID_PARTY_DIR}/dbg_macro # for debug
43 58 
59+ ${ASCEND_CANN_PACKAGE_PATH}/include
44 ${ASCEND_CANN_PACKAGE_PATH}/include/hccl60 ${ASCEND_CANN_PACKAGE_PATH}/include/hccl
45)61)
46 62 
@@ -11,163 +11,9 @@
11#ifndef AIV_COMMUNICATION_BASE_V2_H11#ifndef AIV_COMMUNICATION_BASE_V2_H
12#define AIV_COMMUNICATION_BASE_V2_H12#define AIV_COMMUNICATION_BASE_V2_H
13 13 
14-#include "kernel_operator.h"
15#include "sync_interface.h"14#include "sync_interface.h"
16#include "sim_common_defs.h"15#include "sim_common_defs.h"
17- 16+#include "aiv_defines.h"
18-using namespace AscendC;
19- 
20-#define EXPORT_AIV_META_INFO(kernel_name) \
21-static const struct FunLevelKType kernel_name##_kernel_type_section __attribute__ \
22-((used, section (".ascend.meta." #kernel_name))) \
23-= {{F_TYPE_KTYPE, sizeof(unsigned int), K_TYPE_AIV}}
24- 
25-constexpr uint32_t MAX_RANK_SIZE = 512; // server内最大卡数
26-constexpr uint32_t MAX_RANK_SIZE_V = 256;
27-constexpr uint32_t BR_CTRL_CORE_LIMIT_RANK_SIZE = 16;
28-constexpr uint64_t BUFFER_OUT_ADDR_OFFSET = 16 * 1024;
29-constexpr uint64_t TOPO_LEN_Y_OFFSET = 8;
30-constexpr uint64_t TOPO_LEN_Z_OFFSET = 16;
31-constexpr uint64_t LOCAL_FLAG_BUF_LEN = 2560;
32-constexpr uint64_t AIV_TAG_MOVE_RIGHT_BITS = 16;
33-constexpr uint64_t LOW_16_BITS = 0xFFFF;
34-constexpr uint64_t DATA_LIMIT = 512 * 1024;
35-constexpr uint32_t PING_PONG = 2;
36- 
37-struct ExtraArgs {
38- uint64_t sendCounts[MAX_RANK_SIZE_V] = {};
39- uint64_t sendDispls[MAX_RANK_SIZE_V] = {};
40- uint64_t recvCounts[MAX_RANK_SIZE_V] = {};
41- uint64_t recvDispls[MAX_RANK_SIZE_V] = {};
42-};
43- 
44-using AivSuperKernelArgs = struct AivSuperKernelArgsDef {
45- GM_ADDR buffersIn = nullptr; // 注册的CCLIN地址,所有卡可访问
46- uint64_t rank;
47- uint64_t rankSize;
48- uint64_t len;
49- uint64_t dataType;
50- uint64_t unitSize;
51- uint64_t reduceOp;
52- uint64_t numBlocks;
53- uint64_t tag; // 第几次调用,定时重置成1
54- uint64_t clearEnable;
55- uint64_t inputSliceStride;
56- uint64_t outputSliceStride;
57- uint64_t repeatNum;
58- uint64_t inputRepeatStride;
59- uint64_t outputRepeatStride;
60- uint64_t input;
61- uint64_t output;
62- uint64_t cclBufferSize;
63-};
64- 
65-enum class AivNotifyType {
66- ACK,
67- DataSignal,
68- Done
69-};
70- 
71-enum class CommPattern {
72- //server间
73- interRank,
74- //server内
75- intraRank
76-};
77- 
78-#define KERNEL_ARGS_DEF \
79-GM_ADDR buffIn, \
80-uint64_t input, uint64_t output, uint32_t rank, uint32_t sendRecvRemoteRank, uint32_t rankSize, uint64_t xRankSize, uint64_t yRankSize, uint64_t zRankSize, uint64_t len, \
81-uint32_t dataType, uint32_t reduceOp, uint32_t root, uint32_t sliceId, \
82-uint64_t inputSliceStride, uint64_t outputSliceStride, uint64_t repeatNum, uint64_t inputRepeatStride, uint64_t outputRepeatStride, \
83-uint32_t numBlocks, bool isOpBase, \
84-GM_ADDR headCountMem, \
85-GM_ADDR tailCountMem, GM_ADDR addOneMem, uint32_t counterMemSize, bool isEnableCounter
86- 
87-#define EXTERN_KERNEL_ARGS_DEF_V2 \
88-KERNEL_ARGS_DEF, ExtraArgs extraArgs
89- 
90-#define KERNEL_ARGS_CALL \
91-buffIn, \
92-input, output, rank, sendRecvRemoteRank, rankSize, xRankSize, yRankSize, zRankSize, len, dataType, reduceOp, root, sliceId, \
93-inputSliceStride, outputSliceStride, repeatNum, inputRepeatStride, outputRepeatStride, \
94-numBlocks, isOpBase, \
95-headCountMem, tailCountMem, addOneMem, counterMemSize, isEnableCounter
96- 
97-#define EXTERN_KERNEL_ARGS_CALL \
98-KERNEL_ARGS_CALL, extraArgs
99- 
100-#define KERNEL_CLASS_INIT \
101-buffIn, input, output,\
102-rank, sendRecvRemoteRank, rankSize, xRankSize, yRankSize, zRankSize, len, dataType, reduceOp, root, \
103-inputSliceStride, outputSliceStride, repeatNum, inputRepeatStride, outputRepeatStride, \
104-headCountMem, tailCountMem, addOneMem, counterMemSize, isEnableCounter, numBlocks
105- 
106-#define SUPERKERNEL_LITE_ARGS_DEF \
107-uint64_t args_offset
108- 
109-#define SUPERKERNEL_LITE_ARGS_EXTRACT \
110- GM_ADDR *param_base = (GM_ADDR *)get_para_base();\
111- GM_ADDR hiddenInput = param_base[args_offset++];\
112- GM_ADDR input = param_base[args_offset++];\
113- GM_ADDR output = param_base[args_offset++]
114- 
115-#define SUPERKERNEL_ARGS_DEF \
116-GM_ADDR hiddenInput, GM_ADDR input, GM_ADDR output
117- 
118-#define SUPERKERNEL_ARGS_CALL \
119-hiddenInput, input, output
120- 
121-#define SUPERKERNEL_CLASS_INIT \
122-hiddenInput, input, output
123- 
124-constexpr uint64_t AIV_FLAG_BUFFER_SIZE = 3 * 1024 * 1024; // aiv算子的flag区域大小
125-constexpr uint64_t CLEAR_BUFFER_OFFSET = 1024 * 1024; // 用于清空的aiv buffer的偏移
126-constexpr uint64_t SYNC_BUFFER_OFFSET = 2 * 1024 * 1024; // 用于sync的aiv buffer的偏移
127-constexpr uint64_t BUFFER_AREA = 1024 * 1024; // aiv算子的单独功能flag区域大小
128- 
129-constexpr uint64_t AIV_PING_PONG_FACTOR_TWO = 2;
130-constexpr uint32_t NUM_BLOCKS_FOUR_PER_RANK_A3 = 4;
131-constexpr uint32_t MAX_NUM_BLOCKS = 48;
132- 
133-constexpr uint64_t FLAG_SIZE = 128;
134-constexpr uint64_t UB_ALIGN_SIZE = 32;
135-constexpr uint64_t UB_FLAG_SIZE = 32;
136-constexpr uint64_t UB_FLAG_SIZE_4 = UB_FLAG_SIZE * 4;
137-constexpr uint64_t UB_FLAG_SIZE_8 = UB_FLAG_SIZE * 8;
138-constexpr uint64_t UB_MAX_DATA_SIZE = 190 * 1024;
139-constexpr uint64_t UB_DB_DATA_BATCH_SIZE = UB_MAX_DATA_SIZE / 2;
140-constexpr uint32_t MaxBufferSize = 200 * 1024 * 1024;
141- 
142-constexpr uint64_t ATOMIC_FLAG_SIZE = 512;
143-constexpr uint64_t FLAG_ONE_OFFSET = 0;
144-constexpr uint64_t FLAG_TWO_OFFSET = FLAG_SIZE;
145-constexpr uint64_t FLAG_THREE_OFFSET = FLAG_SIZE * 2;
146-constexpr uint64_t FLAG_FOUR_OFFSET = FLAG_SIZE * 3;
147-constexpr uint64_t FLAG_FIVE_OFFSET = FLAG_SIZE * 4;
148- 
149-constexpr uint64_t DOUBLE = 2;
150-constexpr uint64_t FLAG_BUF_NUM = 3;
151-constexpr uint64_t TILING_NUM = 4;
152-constexpr uint64_t CHUNK_SIZE = 2048;
153- 
154-constexpr int32_t TAG_INIT_VALUE = 1;
155-constexpr int32_t TAG_RESET_COUNT = 1000;
156-constexpr uint32_t AIV_FLAG_CLEAR_OFFSET = 512 * 1024;
157-// 相对于GM_OUT,前同步、尾同步使用的同步标记区的偏移,也是普通标记区的大小
158-constexpr uint32_t FLAG1_OFFSET = AivCommInfoLayout::FLAG1_OFFSET;
159-constexpr uint32_t FLAG2_OFFSET = AivCommInfoLayout::FLAG2_OFFSET;
160-constexpr uint32_t BASE_FLAG_OFFSET = AivCommInfoLayout::BASE_FLAG_OFFSET;
161-constexpr uint32_t AIV_FLAG_EMPTY_OFFSET = AivCommInfoLayout::EMPTY_CLEAR_OFFSET;
162-constexpr uint32_t GM_OUT_PING_OFFSET = AivCommInfoLayout::PING_OFFSET;
163-constexpr uint32_t GM_OUT_PONG_OFFSET = AivCommInfoLayout::PONG_OFFSET;
164- 
165-/**
166- * ccl buffers GM_OUT Tag(大小4) flag1 flag2 BarrierBase Clear data1 data2
167- * 0 | 16K | 512K | 1M | 5M | 9M | 10M | 18M | 34M
168- * BUFFER_OUT_ADDR_OFFSET | AIV_FLAG_CLEAR_OFFSET | FLAG1_OFFSET| FLAG2_OFFSET | BASE_FLAG_OFFSET | AIV_FLAG_EMPTY_OFFSET |GM_OUT_PING_OFFSET | GM_OUT_PONG_OFFSET
169- */
170- 
171 17 
172class AivCommBase {18class AivCommBase {
173public:19public:
@@ -32,7 +32,7 @@
32#include "store_sim_memory_manager.h"32#include "store_sim_memory_manager.h"
33#include "db_sim_op_db_ops.h"33#include "db_sim_op_db_ops.h"
34#include "db_sim_runner_ops.h"34#include "db_sim_runner_ops.h"
35- 35+#include "sim_common_api.h"
36 36 
37extern "C" uint8_t GetOpExpansionMode();37extern "C" uint8_t GetOpExpansionMode();
38 38 
@@ -360,8 +360,8 @@ HcclResult HcclAlltoAll(const void *sendBuf, uint64_t sendCount, HcclDataType se
360 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);360 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);
361 HCCL_VM_INFO("sendCount = {}", sendCount);361 HCCL_VM_INFO("sendCount = {}", sendCount);
362 HCCL_VM_INFO("recvCount = {}", recvCount);362 HCCL_VM_INFO("recvCount = {}", recvCount);
363- HCCL_VM_INFO("sendType = {}", static_cast<int>(sendType));363+ HCCL_VM_INFO("sendType = {}", GetDataTypeStr(sendType));
364- HCCL_VM_INFO("recvType = {}", static_cast<int>(recvType));364+ HCCL_VM_INFO("recvType = {}", GetDataTypeStr(recvType));
365 HCCL_VM_INFO("comm = {:p}", comm);365 HCCL_VM_INFO("comm = {:p}", comm);
366 HCCL_VM_INFO("stream = {:p}", stream);366 HCCL_VM_INFO("stream = {:p}", stream);
367 367
@@ -370,12 +370,12 @@ HcclResult HcclAlltoAll(const void *sendBuf, uint64_t sendCount, HcclDataType se
370 // 注册input、output buffer370 // 注册input、output buffer
371 uint32_t inDataSize = 0;371 uint32_t inDataSize = 0;
372 if (sim::GetDataTypeSize(sendType, inDataSize) != HcclResult::HCCL_SUCCESS) {372 if (sim::GetDataTypeSize(sendType, inDataSize) != HcclResult::HCCL_SUCCESS) {
373- HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAlltoAll send type calc size", static_cast<uint16_t>(sendType));373+ HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAlltoAll send type calc size", GetDataTypeStr(sendType));
374 return HcclResult::HCCL_E_NOT_SUPPORT;374 return HcclResult::HCCL_E_NOT_SUPPORT;
375 }375 }
376 uint32_t outDataSize = 0;376 uint32_t outDataSize = 0;
377 if (sim::GetDataTypeSize(recvType, outDataSize) != HcclResult::HCCL_SUCCESS) {377 if (sim::GetDataTypeSize(recvType, outDataSize) != HcclResult::HCCL_SUCCESS) {
378- HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAlltoAll recv type calc size", static_cast<uint16_t>(recvType));378+ HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAlltoAll recv type calc size", GetDataTypeStr(recvType));
379 return HcclResult::HCCL_E_NOT_SUPPORT;379 return HcclResult::HCCL_E_NOT_SUPPORT;
380 }380 }
381 uint64_t inputSize = static_cast<uint64_t>(inDataSize) * sendCount * rankSize;381 uint64_t inputSize = static_cast<uint64_t>(inDataSize) * sendCount * rankSize;
@@ -417,8 +417,8 @@ HcclResult HcclAlltoAllVC(const void *sendBuf, const void *sendCountMatrix, Hccl
417 HCCL_VM_INFO("sendBuf = {:p}", sendBuf);417 HCCL_VM_INFO("sendBuf = {:p}", sendBuf);
418 HCCL_VM_INFO("sendCountMatrix = {:p}", sendCountMatrix);418 HCCL_VM_INFO("sendCountMatrix = {:p}", sendCountMatrix);
419 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);419 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);
420- HCCL_VM_INFO("sendType = {}", static_cast<int>(sendType));420+ HCCL_VM_INFO("sendType = {}", GetDataTypeStr(sendType));
421- HCCL_VM_INFO("recvType = {}", static_cast<int>(recvType));421+ HCCL_VM_INFO("recvType = {}", GetDataTypeStr(recvType));
422 HCCL_VM_INFO("comm = {:p}", comm);422 HCCL_VM_INFO("comm = {:p}", comm);
423 HCCL_VM_INFO("stream = {:p}", stream);423 HCCL_VM_INFO("stream = {:p}", stream);
424 424 
@@ -440,12 +440,12 @@ HcclResult HcclAlltoAllVC(const void *sendBuf, const void *sendCountMatrix, Hccl
440 440 
441 uint32_t sendDataSize = 0;441 uint32_t sendDataSize = 0;
442 if (sim::GetDataTypeSize(sendType, sendDataSize) != HcclResult::HCCL_SUCCESS) {442 if (sim::GetDataTypeSize(sendType, sendDataSize) != HcclResult::HCCL_SUCCESS) {
443- HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAlltoAllVC send type calc size", static_cast<uint16_t>(sendType));443+ HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAlltoAllVC send type calc size", GetDataTypeStr(sendType));
444 return HcclResult::HCCL_E_NOT_SUPPORT;444 return HcclResult::HCCL_E_NOT_SUPPORT;
445 }445 }
446 uint32_t recvDataSize = 0;446 uint32_t recvDataSize = 0;
447 if (sim::GetDataTypeSize(recvType, recvDataSize) != HcclResult::HCCL_SUCCESS) {447 if (sim::GetDataTypeSize(recvType, recvDataSize) != HcclResult::HCCL_SUCCESS) {
448- HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAlltoAllVC recv type calc size", static_cast<uint16_t>(recvType));448+ HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAlltoAllVC recv type calc size", GetDataTypeStr(recvType));
449 return HcclResult::HCCL_E_NOT_SUPPORT;449 return HcclResult::HCCL_E_NOT_SUPPORT;
450 }450 }
451 451 
@@ -483,8 +483,8 @@ HcclResult HcclAlltoAllV(const void *sendBuf, const void *sendCounts, const void
483 HCCL_VM_INFO("HcclAlltoAllV called with parameters:");483 HCCL_VM_INFO("HcclAlltoAllV called with parameters:");
484 HCCL_VM_INFO("sendBuf = {:p}", sendBuf);484 HCCL_VM_INFO("sendBuf = {:p}", sendBuf);
485 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);485 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);
486- HCCL_VM_INFO("sendType = {}", static_cast<int>(sendType));486+ HCCL_VM_INFO("sendType = {}", GetDataTypeStr(sendType));
487- HCCL_VM_INFO("recvType = {}", static_cast<int>(recvType));487+ HCCL_VM_INFO("recvType = {}", GetDataTypeStr(recvType));
488 HCCL_VM_INFO("comm = {:p}", comm);488 HCCL_VM_INFO("comm = {:p}", comm);
489 HCCL_VM_INFO("stream = {:p}", stream);489 HCCL_VM_INFO("stream = {:p}", stream);
490 490
@@ -495,12 +495,12 @@ HcclResult HcclAlltoAllV(const void *sendBuf, const void *sendCounts, const void
495 // auto outDataSize = DATA_TYPE_SIZE_MAP.at(recvType);495 // auto outDataSize = DATA_TYPE_SIZE_MAP.at(recvType);
496 uint32_t inDataSize = 0;496 uint32_t inDataSize = 0;
497 if (sim::GetDataTypeSize(sendType, inDataSize) != HcclResult::HCCL_SUCCESS) {497 if (sim::GetDataTypeSize(sendType, inDataSize) != HcclResult::HCCL_SUCCESS) {
498- HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAlltoAllV send type calc size", static_cast<uint16_t>(sendType));498+ HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAlltoAllV send type calc size", GetDataTypeStr(sendType));
499 return HcclResult::HCCL_E_NOT_SUPPORT;499 return HcclResult::HCCL_E_NOT_SUPPORT;
500 }500 }
501 uint32_t outDataSize = 0;501 uint32_t outDataSize = 0;
502 if (sim::GetDataTypeSize(recvType, outDataSize) != HcclResult::HCCL_SUCCESS) {502 if (sim::GetDataTypeSize(recvType, outDataSize) != HcclResult::HCCL_SUCCESS) {
503- HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAlltoAllV recv type calc size", static_cast<uint16_t>(recvType));503+ HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAlltoAllV recv type calc size", GetDataTypeStr(recvType));
504 return HcclResult::HCCL_E_NOT_SUPPORT;504 return HcclResult::HCCL_E_NOT_SUPPORT;
505 }505 }
506 uint64_t inCountTotal = 0;506 uint64_t inCountTotal = 0;
@@ -566,7 +566,7 @@ HcclResult HcclAllGather(void *sendBuf, void *recvBuf, uint64_t sendCount, HcclD
566 HCCL_VM_INFO("sendBuf = {:p}", sendBuf);566 HCCL_VM_INFO("sendBuf = {:p}", sendBuf);
567 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);567 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);
568 HCCL_VM_INFO("sendCount = {}", sendCount);568 HCCL_VM_INFO("sendCount = {}", sendCount);
569- HCCL_VM_INFO("dataType = {}", static_cast<int>(dataType));569+ HCCL_VM_INFO("dataType = {}", GetDataTypeStr(dataType));
570 HCCL_VM_INFO("comm = {:p}", comm);570 HCCL_VM_INFO("comm = {:p}", comm);
571 HCCL_VM_INFO("stream = {:p}", stream);571 HCCL_VM_INFO("stream = {:p}", stream);
572 572
@@ -576,7 +576,7 @@ HcclResult HcclAllGather(void *sendBuf, void *recvBuf, uint64_t sendCount, HcclD
576 // auto dataSize = DATA_TYPE_SIZE_MAP.at(dataType);576 // auto dataSize = DATA_TYPE_SIZE_MAP.at(dataType);
577 uint32_t dataSize = 0;577 uint32_t dataSize = 0;
578 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {578 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {
579- HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAllGather calc size", static_cast<uint16_t>(dataType));579+ HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAllGather calc size", GetDataTypeStr(dataType));
580 return HcclResult::HCCL_E_NOT_SUPPORT;580 return HcclResult::HCCL_E_NOT_SUPPORT;
581 }581 }
582 uint64_t inputSize = static_cast<uint64_t>(dataSize) * sendCount;582 uint64_t inputSize = static_cast<uint64_t>(dataSize) * sendCount;
@@ -613,7 +613,7 @@ HcclResult HcclAllGatherV(void *sendBuf, uint64_t sendCount, void *recvBuf,
613 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);613 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);
614 HCCL_VM_INFO("recvCounts = {:p}", recvCounts);614 HCCL_VM_INFO("recvCounts = {:p}", recvCounts);
615 HCCL_VM_INFO("recvDispls = {:p}", recvDispls);615 HCCL_VM_INFO("recvDispls = {:p}", recvDispls);
616- HCCL_VM_INFO("dataType = {}", static_cast<int>(dataType));616+ HCCL_VM_INFO("dataType = {}", GetDataTypeStr(dataType));
617 HCCL_VM_INFO("comm = {:p}", comm);617 HCCL_VM_INFO("comm = {:p}", comm);
618 HCCL_VM_INFO("stream = {:p}", stream);618 HCCL_VM_INFO("stream = {:p}", stream);
619 619 
@@ -638,7 +638,7 @@ HcclResult HcclAllGatherV(void *sendBuf, uint64_t sendCount, void *recvBuf,
638 638 
639 uint32_t dataSize = 0;639 uint32_t dataSize = 0;
640 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {640 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {
641- HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAllGatherV calc size", static_cast<uint16_t>(dataType));641+ HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAllGatherV calc size", GetDataTypeStr(dataType));
642 return HcclResult::HCCL_E_NOT_SUPPORT;642 return HcclResult::HCCL_E_NOT_SUPPORT;
643 }643 }
644 const uint64_t inputSize = sendCount * dataSize;644 const uint64_t inputSize = sendCount * dataSize;
@@ -674,7 +674,7 @@ HcclResult HcclBroadcast(
674 HCCL_VM_INFO("HcclBroadcast called with parameters:");674 HCCL_VM_INFO("HcclBroadcast called with parameters:");
675 HCCL_VM_INFO("buf = {:p}", buf);675 HCCL_VM_INFO("buf = {:p}", buf);
676 HCCL_VM_INFO("count = {}", count);676 HCCL_VM_INFO("count = {}", count);
677- HCCL_VM_INFO("dataType = {}", static_cast<int>(dataType));677+ HCCL_VM_INFO("dataType = {}", GetDataTypeStr(dataType));
678 HCCL_VM_INFO("root = {}", root);678 HCCL_VM_INFO("root = {}", root);
679 HCCL_VM_INFO("comm = {:p}", comm);679 HCCL_VM_INFO("comm = {:p}", comm);
680 HCCL_VM_INFO("stream = {:p}", stream);680 HCCL_VM_INFO("stream = {:p}", stream);
@@ -685,7 +685,7 @@ HcclResult HcclBroadcast(
685 // auto dataSize = DATA_TYPE_SIZE_MAP.at(dataType);685 // auto dataSize = DATA_TYPE_SIZE_MAP.at(dataType);
686 uint32_t dataSize = 0;686 uint32_t dataSize = 0;
687 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {687 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {
688- HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclBroadcast calc size", static_cast<uint16_t>(dataType));688+ HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclBroadcast calc size", GetDataTypeStr(dataType));
689 return HcclResult::HCCL_E_NOT_SUPPORT;689 return HcclResult::HCCL_E_NOT_SUPPORT;
690 }690 }
691 uint64_t size = static_cast<uint64_t>(dataSize) * count;691 uint64_t size = static_cast<uint64_t>(dataSize) * count;
@@ -716,15 +716,15 @@ HcclResult HcclAllReduce(void *sendBuf, void *recvBuf, uint64_t count, HcclDataT
716 HcclComm comm, aclrtStream stream)716 HcclComm comm, aclrtStream stream)
717{717{
718 if (CheckDataAndReduceOpType(dataType, op) != HcclResult::HCCL_SUCCESS) {718 if (CheckDataAndReduceOpType(dataType, op) != HcclResult::HCCL_SUCCESS) {
719- HCCL_VM_ERROR("HCCL_VM not support data type {} or reduce {} op for HcclAllReduce", static_cast<uint16_t>(dataType), static_cast<uint16_t>(op));719+ HCCL_VM_ERROR("HCCL_VM not support data type {} or reduce {} op for HcclAllReduce", GetDataTypeStr(dataType), GetReduceOpStr(op));
720 return HcclResult::HCCL_E_NOT_SUPPORT;720 return HcclResult::HCCL_E_NOT_SUPPORT;
721 }721 }
722 HCCL_VM_INFO("HcclAllReduce called with parameters:");722 HCCL_VM_INFO("HcclAllReduce called with parameters:");
723 HCCL_VM_INFO("sendBuf = {:p}", sendBuf);723 HCCL_VM_INFO("sendBuf = {:p}", sendBuf);
724 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);724 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);
725 HCCL_VM_INFO("count = {}", count);725 HCCL_VM_INFO("count = {}", count);
726- HCCL_VM_INFO("dataType = {}", static_cast<int>(dataType));726+ HCCL_VM_INFO("dataType = {}", GetDataTypeStr(dataType));
727- HCCL_VM_INFO("op = {}", static_cast<int>(op));727+ HCCL_VM_INFO("op = {}", GetReduceOpStr(op));
728 HCCL_VM_INFO("comm = {:p}", comm);728 HCCL_VM_INFO("comm = {:p}", comm);
729 HCCL_VM_INFO("stream = {:p}", stream);729 HCCL_VM_INFO("stream = {:p}", stream);
730 730
@@ -734,7 +734,7 @@ HcclResult HcclAllReduce(void *sendBuf, void *recvBuf, uint64_t count, HcclDataT
734 // auto dataSize = DATA_TYPE_SIZE_MAP.at(dataType);734 // auto dataSize = DATA_TYPE_SIZE_MAP.at(dataType);
735 uint32_t dataSize = 0;735 uint32_t dataSize = 0;
736 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {736 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {
737- HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAllReduce calc size", static_cast<uint16_t>(dataType));737+ HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclAllReduce calc size", GetDataTypeStr(dataType));
738 return HcclResult::HCCL_E_NOT_SUPPORT;738 return HcclResult::HCCL_E_NOT_SUPPORT;
739 }739 }
740 uint64_t size = static_cast<uint64_t>(dataSize) * count;740 uint64_t size = static_cast<uint64_t>(dataSize) * count;
@@ -766,7 +766,7 @@ HcclResult HcclScatter(void *sendBuf, void *recvBuf, uint64_t recvCount, HcclDat
766 HCCL_VM_INFO("sendBuf = {:p}", sendBuf);766 HCCL_VM_INFO("sendBuf = {:p}", sendBuf);
767 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);767 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);
768 HCCL_VM_INFO("recvCount = {}", recvCount);768 HCCL_VM_INFO("recvCount = {}", recvCount);
769- HCCL_VM_INFO("dataType = {}", static_cast<int>(dataType));769+ HCCL_VM_INFO("dataType = {}", GetDataTypeStr(dataType));
770 HCCL_VM_INFO("root = {}", root);770 HCCL_VM_INFO("root = {}", root);
771 HCCL_VM_INFO("comm = {:p}", comm);771 HCCL_VM_INFO("comm = {:p}", comm);
772 HCCL_VM_INFO("stream = {:p}", stream);772 HCCL_VM_INFO("stream = {:p}", stream);
@@ -777,7 +777,7 @@ HcclResult HcclScatter(void *sendBuf, void *recvBuf, uint64_t recvCount, HcclDat
777 // auto dataSize = DATA_TYPE_SIZE_MAP.at(dataType);777 // auto dataSize = DATA_TYPE_SIZE_MAP.at(dataType);
778 uint32_t dataSize = 0;778 uint32_t dataSize = 0;
779 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {779 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {
780- HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclScatter calc size", static_cast<uint16_t>(dataType));780+ HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclScatter calc size", GetDataTypeStr(dataType));
781 return HcclResult::HCCL_E_NOT_SUPPORT;781 return HcclResult::HCCL_E_NOT_SUPPORT;
782 }782 }
783 uint64_t inputValueSize = 0;783 uint64_t inputValueSize = 0;
@@ -831,15 +831,15 @@ HcclResult HcclReduce(void *sendBuf, void *recvBuf, uint64_t count, HcclDataType
831 uint32_t root, HcclComm comm, aclrtStream stream)831 uint32_t root, HcclComm comm, aclrtStream stream)
832{832{
833 if (CheckDataAndReduceOpType(dataType, op) != HcclResult::HCCL_SUCCESS) {833 if (CheckDataAndReduceOpType(dataType, op) != HcclResult::HCCL_SUCCESS) {
834- HCCL_VM_ERROR("HCCL_VM not support data type {} or reduce {} op for HcclReduce", static_cast<uint16_t>(dataType), static_cast<uint16_t>(op));834+ HCCL_VM_ERROR("HCCL_VM not support data type {} or reduce {} op for HcclReduce", GetDataTypeStr(dataType), GetReduceOpStr(op));
835 return HcclResult::HCCL_E_NOT_SUPPORT;835 return HcclResult::HCCL_E_NOT_SUPPORT;
836 }836 }
837 HCCL_VM_INFO("HcclReduce called with parameters:");837 HCCL_VM_INFO("HcclReduce called with parameters:");
838 HCCL_VM_INFO("sendBuf = {:p}", sendBuf);838 HCCL_VM_INFO("sendBuf = {:p}", sendBuf);
839 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);839 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);
840 HCCL_VM_INFO("count = {}", count);840 HCCL_VM_INFO("count = {}", count);
841- HCCL_VM_INFO("dataType = {}", static_cast<int>(dataType));841+ HCCL_VM_INFO("dataType = {}", GetDataTypeStr(dataType));
842- HCCL_VM_INFO("reduce op = {}", static_cast<int>(op));842+ HCCL_VM_INFO("reduce op = {}", GetReduceOpStr(op));
843 HCCL_VM_INFO("root = {}", root);843 HCCL_VM_INFO("root = {}", root);
844 HCCL_VM_INFO("comm = {:p}", comm);844 HCCL_VM_INFO("comm = {:p}", comm);
845 HCCL_VM_INFO("stream = {:p}", stream);845 HCCL_VM_INFO("stream = {:p}", stream);
@@ -850,7 +850,7 @@ HcclResult HcclReduce(void *sendBuf, void *recvBuf, uint64_t count, HcclDataType
850 // auto dataSize = DATA_TYPE_SIZE_MAP.at(dataType);850 // auto dataSize = DATA_TYPE_SIZE_MAP.at(dataType);
851 uint32_t dataSize = 0;851 uint32_t dataSize = 0;
852 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {852 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {
853- HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclReduce calc size", static_cast<uint16_t>(dataType));853+ HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclReduce calc size", GetDataTypeStr(dataType));
854 return HcclResult::HCCL_E_NOT_SUPPORT;854 return HcclResult::HCCL_E_NOT_SUPPORT;
855 }855 }
856 uint64_t size = static_cast<uint64_t>(dataSize) * count;856 uint64_t size = static_cast<uint64_t>(dataSize) * count;
@@ -882,7 +882,7 @@ HcclResult HcclReduceScatter(void *sendBuf, void *recvBuf, uint64_t recvCount, H
882 HcclComm comm, aclrtStream stream)882 HcclComm comm, aclrtStream stream)
883{883{
884 if (CheckDataAndReduceOpType(dataType, op) != HcclResult::HCCL_SUCCESS) {884 if (CheckDataAndReduceOpType(dataType, op) != HcclResult::HCCL_SUCCESS) {
885- HCCL_VM_ERROR("HCCL_VM not support data type {} or reduce {} op for HcclReduceScatter", static_cast<uint16_t>(dataType), static_cast<uint16_t>(op));885+ HCCL_VM_ERROR("HCCL_VM not support data type {} or reduce {} op for HcclReduceScatter", GetDataTypeStr(dataType), GetReduceOpStr(op));
886 return HcclResult::HCCL_E_NOT_SUPPORT;886 return HcclResult::HCCL_E_NOT_SUPPORT;
887 }887 }
888 HCCL_VM_INFO("HcclReduceScatter called with parameters:");888 HCCL_VM_INFO("HcclReduceScatter called with parameters:");
@@ -899,7 +899,7 @@ HcclResult HcclReduceScatter(void *sendBuf, void *recvBuf, uint64_t recvCount, H
899 // 注册input、output buffer899 // 注册input、output buffer
900 uint32_t dataSize = 0;900 uint32_t dataSize = 0;
901 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {901 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {
902- HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclReduceScatter calc size", static_cast<uint16_t>(dataType));902+ HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclReduceScatter calc size", GetDataTypeStr(dataType));
903 return HcclResult::HCCL_E_NOT_SUPPORT;903 return HcclResult::HCCL_E_NOT_SUPPORT;
904 }904 }
905 uint64_t inputSize = static_cast<uint64_t>(dataSize) * recvCount * rankSize;905 uint64_t inputSize = static_cast<uint64_t>(dataSize) * recvCount * rankSize;
@@ -931,7 +931,7 @@ HcclResult HcclReduceScatterV(void *sendBuf, const void *sendCounts, const void
931 void *recvBuf, uint64_t recvCount, HcclDataType dataType, HcclReduceOp op, HcclComm comm, aclrtStream stream)931 void *recvBuf, uint64_t recvCount, HcclDataType dataType, HcclReduceOp op, HcclComm comm, aclrtStream stream)
932{932{
933 if (CheckDataAndReduceOpType(dataType, op) != HcclResult::HCCL_SUCCESS) {933 if (CheckDataAndReduceOpType(dataType, op) != HcclResult::HCCL_SUCCESS) {
934- HCCL_VM_ERROR("HCCL_VM not support data type {} or reduce {} op for HcclReduceScatterV", static_cast<uint16_t>(dataType), static_cast<uint16_t>(op));934+ HCCL_VM_ERROR("HCCL_VM not support data type {} or reduce {} op for HcclReduceScatterV", GetDataTypeStr(dataType), GetReduceOpStr(op));
935 return HcclResult::HCCL_E_NOT_SUPPORT;935 return HcclResult::HCCL_E_NOT_SUPPORT;
936 }936 }
937 HCCL_VM_INFO("HcclReduceScatterV called with parameters:");937 HCCL_VM_INFO("HcclReduceScatterV called with parameters:");
@@ -940,8 +940,8 @@ HcclResult HcclReduceScatterV(void *sendBuf, const void *sendCounts, const void
940 HCCL_VM_INFO("sendDispls = {:p}", sendDispls);940 HCCL_VM_INFO("sendDispls = {:p}", sendDispls);
941 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);941 HCCL_VM_INFO("recvBuf = {:p}", recvBuf);
942 HCCL_VM_INFO("recvCount = {}", recvCount);942 HCCL_VM_INFO("recvCount = {}", recvCount);
943- HCCL_VM_INFO("dataType = {}", static_cast<int>(dataType));943+ HCCL_VM_INFO("dataType = {}", GetDataTypeStr(dataType));
944- HCCL_VM_INFO("reduce op = {}", static_cast<int>(op));944+ HCCL_VM_INFO("reduce op = {}", GetReduceOpStr(op));
945 HCCL_VM_INFO("comm = {:p}", comm);945 HCCL_VM_INFO("comm = {:p}", comm);
946 HCCL_VM_INFO("stream = {:p}", stream);946 HCCL_VM_INFO("stream = {:p}", stream);
947 947 
@@ -966,7 +966,7 @@ HcclResult HcclReduceScatterV(void *sendBuf, const void *sendCounts, const void
966 966 
967 uint32_t dataSize = 0;967 uint32_t dataSize = 0;
968 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {968 if (sim::GetDataTypeSize(dataType, dataSize) != HcclResult::HCCL_SUCCESS) {
969- HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclReduceScatterV calc size", static_cast<uint16_t>(dataType));969+ HCCL_VM_ERROR("HCCL_VM not support data type {} for HcclReduceScatterV calc size", GetDataTypeStr(dataType));
970 return HcclResult::HCCL_E_NOT_SUPPORT;970 return HcclResult::HCCL_E_NOT_SUPPORT;
971 }971 }
972 const uint64_t inputSize = totalSendCount * dataSize;972 const uint64_t inputSize = totalSendCount * dataSize;
@@ -522,6 +522,14 @@ int RaGetDevEidInfoList(struct RaInfo info, struct HccpDevEidInfo infoList[], un
522 infoList[idx].chipId = info.phyId; // todo: 单server, logic id与rank id相等,但多server此处有问题。522 infoList[idx].chipId = info.phyId; // todo: 单server, logic id与rank id相等,但多server此处有问题。
523 infoList[idx].dieId = endPoints[idx].die_id;523 infoList[idx].dieId = endPoints[idx].die_id;
524 memcpy(infoList[idx].eid.raw, endPoints[idx].eid, sizeof(endPoints[idx].eid));524 memcpy(infoList[idx].eid.raw, endPoints[idx].eid, sizeof(endPoints[idx].eid));
525+ 
526+ Eid eid{};
527+ for (uint32_t i = 0; i < URMA_EID_LEN; i++) {
528+ eid.raw[i] = endPoints[idx].eid[i];
529+ }
530+ IpAddress addr(eid);
531+ auto ipAddr = addr.GetIpStr().substr(2);
532+ HCCL_VM_INFO("ipAddr: {}, phyId: {}, serverKey=: {}", ipAddr, info.phyId, g_cur_server_key);
525 }533 }
526 534 
527 return 0;535 return 0;
@@ -446,14 +446,14 @@ int RaSocketSend(const void *fdHandle, const void *data, unsigned long long size
446 std::string socketKey;446 std::string socketKey;
447 GetRaSendSocketkeyByFd(socketFd, socketKey);447 GetRaSendSocketkeyByFd(socketFd, socketKey);
448 448 
449- int ret = sim::CommunicationMemoryManager::GetInstance().WriteCommMem(socketKey.data(), data, size);449+ int64_t ret = sim::CommunicationMemoryManager::GetInstance().WriteCommMem(socketKey.data(), data, size);
450- if (ret != 0) {450+ if (ret == -1) {
451 HCCL_VM_ERROR(" cannot pair socket:{:d} role:{:d}, key={}", FD_PAIR_ID(socketFd),451 HCCL_VM_ERROR(" cannot pair socket:{:d} role:{:d}, key={}", FD_PAIR_ID(socketFd),
452 FD_ROLE(socketFd), socketKey);452 FD_ROLE(socketFd), socketKey);
453 return -1;453 return -1;
454 }454 }
455 455 
456- *sentSize = size;456+ *sentSize = ret;
457 HCCL_VM_INFO(" pair socket:{:d} role:{:d} key={} Send:{:d}", FD_PAIR_ID(socketFd),457 HCCL_VM_INFO(" pair socket:{:d} role:{:d} key={} Send:{:d}", FD_PAIR_ID(socketFd),
458 FD_ROLE(socketFd), socketKey.data(), size);458 FD_ROLE(socketFd), socketKey.data(), size);
459 459 
@@ -470,7 +470,6 @@ int RaSocketRecv(const void *fdHandle, void *data, unsigned long long size, unsi
470 if (ret == 0) {470 if (ret == 0) {
471 HCCL_VM_WARN(" socket pair:{:d} role:{:d}, key={} read try again",471 HCCL_VM_WARN(" socket pair:{:d} role:{:d}, key={} read try again",
472 FD_PAIR_ID(socketFd), FD_ROLE(socketFd), socketKey);472 FD_PAIR_ID(socketFd), FD_ROLE(socketFd), socketKey);
473- std::this_thread::sleep_for(std::chrono::milliseconds(500));
474 return SOCK_EAGAIN;473 return SOCK_EAGAIN;
475 } else if (ret == -1) {474 } else if (ret == -1) {
476 HCCL_VM_ERROR(" socket pair:{:d} role:{:d}, key={} recv failed",475 HCCL_VM_ERROR(" socket pair:{:d} role:{:d}, key={} recv failed",
@@ -568,7 +567,8 @@ int RaSocketRecvAsync(const void *fdHandle, void *data, unsigned long long size,
568 if (ret == 0) {567 if (ret == 0) {
569 HCCL_VM_WARN(" socket pair:{:d} role:{:d} key:{} try again",568 HCCL_VM_WARN(" socket pair:{:d} role:{:d} key:{} try again",
570 FD_PAIR_ID(socketFd), FD_ROLE(socketFd), socketKey);569 FD_PAIR_ID(socketFd), FD_ROLE(socketFd), socketKey);
571- std::this_thread::sleep_for(std::chrono::milliseconds(100));570+ std::this_thread::sleep_for(std::chrono::milliseconds(1));
571+ *receivedSize = 0;
572 return 0;572 return 0;
573 } else if (ret == -1) {573 } else if (ret == -1) {
574 HCCL_VM_ERROR(" socket pair:{:d} role:{:d} key:{} recv failed",574 HCCL_VM_ERROR(" socket pair:{:d} role:{:d} key:{} recv failed",
@@ -927,13 +927,13 @@ int RaGetDevBaseAttr(void *ctxHandle, struct DevBaseAttr *attr)
927 priorityInfo.tpType.bs.rtp = 1;927 priorityInfo.tpType.bs.rtp = 1;
928 }928 }
929 929 
930- attr->sqMaxDepth = 1024;930+ attr->sqMaxDepth = 8192; // max_jfs_depth
931- attr->rqMaxDepth = 1024;931+ attr->rqMaxDepth = 32768; // max_jfr_depth
932- attr->sqMaxSge = 8;932+ attr->sqMaxSge = 13; // max_jfs_sge
933- attr->rqMaxSge = 8;933+ attr->rqMaxSge = 4; // max_jfr_sge
934- attr->maxReadSize = 1024 * 1024;934+ attr->maxReadSize = 256 * 1024 * 1024; // max_read_size
935- attr->maxWriteSize = 1024 * 1024;935+ attr->maxWriteSize = 256 * 1024 * 1024; // max_write_size
936- attr->maxMsgSize = 2ULL * 1024 * 1024 * 1024;936+ attr->maxMsgSize = 65536; // max_msg_size
937 937 
938 return 0;938 return 0;
939}939}
@@ -99,7 +99,7 @@ aclError GetDeviceByServerKeyAndPhysicalId(uint64_t serverKey, uint32_t deviceId
99 return ACL_SUCCESS;99 return ACL_SUCCESS;
100}100}
101 101 
102-aclError UpdateDeviceLogicId(uint64_t serverKey, uint32_t phyDevId, uint32_t logicDevId)102+aclError UpdateDeviceLogicId(uint64_t serverKey, uint32_t phyDevId, uint32_t logicDevId, uint32_t userId)
103{103{
104 sim::Device device{};104 sim::Device device{};
105 auto ret = GetDeviceByServerKeyAndPhysicalId(serverKey, phyDevId, device);105 auto ret = GetDeviceByServerKeyAndPhysicalId(serverKey, phyDevId, device);
@@ -108,8 +108,9 @@ aclError UpdateDeviceLogicId(uint64_t serverKey, uint32_t phyDevId, uint32_t log
108 }108 }
109 109 
110 auto deviceKey = device.id;110 auto deviceKey = device.id;
111- RunnerDB::Update<sim::Device>(deviceKey, [deviceKey, logicDevId](sim::Device &dev) { 111+ RunnerDB::Update<sim::Device>(deviceKey, [deviceKey, logicDevId, userId](sim::Device &dev) {
112 dev.logic_id = logicDevId;112 dev.logic_id = logicDevId;
113+ dev.user_id = userId;
113 dev.status = 1;// 设备状态设置为可用114 dev.status = 1;// 设备状态设置为可用
114 });115 });
115 116 
@@ -128,8 +129,10 @@ bool ResetAllDeviceLogicId()
128 129 
129 for (auto &device : allDevices) {130 for (auto &device : allDevices) {
130 auto deviceKey = device.id;131 auto deviceKey = device.id;
131- RunnerDB::Update<sim::Device>(deviceKey, [deviceKey](sim::Device &dev) { 132+ RunnerDB::Update<sim::Device>(deviceKey, [deviceKey](sim::Device &dev) {
132 dev.logic_id = 0xFFFF;133 dev.logic_id = 0xFFFF;
134+ dev.status = 0; // 重置设备状态,防止残留 status=1 干扰后续 aclrtGetDeviceCount
135+ dev.user_id = 0xFFFF;
133 });136 });
134 }137 }
135 138 
@@ -12,6 +12,7 @@
12 12 
13#include <cstdint>13#include <cstdint>
14#include <cstring>14#include <cstring>
15+#include <algorithm>
15 16 
16#include "sim_log.h"17#include "sim_log.h"
17 18 
@@ -110,37 +111,38 @@ int CommunicationMemoryManager::ReleaseCommMem(const char* name) {
110 return 0;111 return 0;
111}112}
112 113 
113-int CommunicationMemoryManager::WriteCommMem(const char* name, const void* dataPtr, size_t size)114+int64_t CommunicationMemoryManager::WriteCommMem(const char* name, const void* dataPtr, size_t size)
114{115{
115 if (!name || !dataPtr || size == 0) {116 if (!name || !dataPtr || size == 0) {
116 HCCL_VM_ERROR("write invalid params, name: {}, dataPtr: {}, size: {}", name, dataPtr, size);117 HCCL_VM_ERROR("write invalid params, name: {}, dataPtr: {}, size: {}", name, dataPtr, size);
117 return -1;118 return -1;
118 }119 }
119 120 
120- std::lock_guard<std::mutex> lock(m_mutex);121+ void* ptr = nullptr;
121- if (m_commMemMap.find(name) == m_commMemMap.end()) {122+ {
122- HCCL_VM_ERROR("write comm mem not found, name: {}", name);123+ std::lock_guard<std::mutex> lock(m_mutex);
123- return -1;124+ auto iter = m_commMemMap.find(name);
125+ if (iter == m_commMemMap.end()) {
126+ HCCL_VM_ERROR("write comm mem not found, name: {}", name);
127+ return -1;
128+ }
129+ ptr = iter->second;
124 }130 }
125- void* ptr = m_commMemMap[name];
126 MemoryManager::GetInstance().LockMemByName(name);131 MemoryManager::GetInstance().LockMemByName(name);
127 132 
128 CommMemHead* head = (CommMemHead*)ptr;133 CommMemHead* head = (CommMemHead*)ptr;
129 134 
130- if (size + head->bufferSize > RA_SOCKET_BUF_SIZE) {135+ int64_t realSend = RA_SOCKET_BUF_SIZE - head->bufferSize;
131- MemoryManager::GetInstance().UnlockMemByName(name);136+ realSend = std::min((int64_t)size, realSend);
132- HCCL_VM_ERROR("write size too large, size: {}, max: {}", size, RA_SOCKET_BUF_SIZE);
133- return -1;
134- }
135 137 
136- memcpy(head->data + head->bufferSize, dataPtr, size);138+ memcpy(head->data + head->bufferSize, dataPtr, realSend);
137- head->bufferSize += size;139+ head->bufferSize += realSend;
138- head->writeTotalBytes += size;140+ head->writeTotalBytes += realSend;
139 uint64_t totalWrite = head->writeTotalBytes;141 uint64_t totalWrite = head->writeTotalBytes;
140 142 
141 MemoryManager::GetInstance().UnlockMemByName(name);143 MemoryManager::GetInstance().UnlockMemByName(name);
142- HCCL_VM_INFO("write name: {}, size: {}, totalWriteBytes: {}", name, size, totalWrite);144+ HCCL_VM_INFO("write name: {}, size:{} real:{}, totalWriteBytes: {}", name, size, realSend, totalWrite);
143- return 0;145+ return realSend;
144}146}
145 147 
146int CommunicationMemoryManager::ReadCommMem(const char* name, void* dataPtr, size_t size)148int CommunicationMemoryManager::ReadCommMem(const char* name, void* dataPtr, size_t size)
@@ -150,12 +152,16 @@ int CommunicationMemoryManager::ReadCommMem(const char* name, void* dataPtr, siz
150 return -1;152 return -1;
151 }153 }
152 154 
153- std::lock_guard<std::mutex> lock(m_mutex);155+ void* ptr = nullptr;
154- if (m_commMemMap.find(name) == m_commMemMap.end()) {156+ {
155- HCCL_VM_ERROR("read comm mem not found, name: {}", name);157+ std::lock_guard<std::mutex> lock(m_mutex);
156- return -1;158+ auto iter = m_commMemMap.find(name);
159+ if (iter == m_commMemMap.end()) {
160+ HCCL_VM_ERROR("read comm mem not found, name: {}", name);
161+ return -1;
162+ }
163+ ptr = iter->second;
157 }164 }
158- void* ptr = m_commMemMap[name];
159 MemoryManager::GetInstance().LockMemByName(name);165 MemoryManager::GetInstance().LockMemByName(name);
160 166 
161 CommMemHead* head = (CommMemHead*)ptr;167 CommMemHead* head = (CommMemHead*)ptr;
@@ -162,21 +162,30 @@ HcclVmResult AscendClusterTopoParser::InitCommunicationDomain(const TopoMeta& to
162{162{
163 HCCL_VM_DEBUG("Enter InitCommunicationDomain");163 HCCL_VM_DEBUG("Enter InitCommunicationDomain");
164 164 
165- uint32_t rankId = 0;165+ // 第一步:初始化所有 server 上的 Device(logic_id = physical_id,保持不变)
166 for (uint32_t superPodIdx = 0; superPodIdx < topoMeta.size(); ++superPodIdx) {166 for (uint32_t superPodIdx = 0; superPodIdx < topoMeta.size(); ++superPodIdx) {
167 auto superPod = topoMeta[superPodIdx];167 auto superPod = topoMeta[superPodIdx];
168 for (uint32_t serverIdx = 0; serverIdx < superPod.size(); ++serverIdx) {168 for (uint32_t serverIdx = 0; serverIdx < superPod.size(); ++serverIdx) {
169 auto server = superPod[serverIdx];169 auto server = superPod[serverIdx];
170- auto logicDevId = 0;
171 auto serverKey = sim::GetServerKeyById(superPodIdx, serverIdx);170 auto serverKey = sim::GetServerKeyById(superPodIdx, serverIdx);
172 for (uint32_t deviceIdx = 0; deviceIdx < server.size(); ++deviceIdx) {171 for (uint32_t deviceIdx = 0; deviceIdx < server.size(); ++deviceIdx) {
173- if (InitDynamicModelData(serverKey, rankId++, logicDevId++, server[deviceIdx]) != HcclVmResult::HCCL_SIM_SUCCESS) {172+ // logic_id = physical_id = deviceIdx,按顺序递增
173+ // todo: 暂时不考虑容器场景,userId == logicDevId
174+ auto userId = deviceIdx;
175+ if (sim::UpdateDeviceLogicId(serverKey, deviceIdx, deviceIdx, userId) != ACL_SUCCESS) {
176+ HCCL_VM_ERROR("update device logic id by serverKey {:d} failed", serverKey);
174 return HcclVmResult::HCCL_SIM_E_INTERNAL;177 return HcclVmResult::HCCL_SIM_E_INTERNAL;
175 }178 }
176 }179 }
177 }180 }
178 }181 }
179 182 
183+ // 第二步:按 rankId % deviceCount 的逻辑创建 Rank 表
184+ if (InitDynamicModelData(topoMeta) != HcclVmResult::HCCL_SIM_SUCCESS) {
185+ HCCL_VM_ERROR("init dynamic model data failed");
186+ return HcclVmResult::HCCL_SIM_E_INTERNAL;
187+ }
188+ 
180 // 通信域未初始化,则需创建ranktable.json文件189 // 通信域未初始化,则需创建ranktable.json文件
181 if (status_ == HvmClusterStatus::COMM_DOMAIN_UNINIT && !withRanktable) {190 if (status_ == HvmClusterStatus::COMM_DOMAIN_UNINIT && !withRanktable) {
182 // 根据topoMeta生成ranktable.json文件191 // 根据topoMeta生成ranktable.json文件
@@ -190,45 +199,56 @@ HcclVmResult AscendClusterTopoParser::InitCommunicationDomain(const TopoMeta& to
190 return HcclVmResult::HCCL_SIM_SUCCESS;199 return HcclVmResult::HCCL_SIM_SUCCESS;
191}200}
192 201 
193-HcclVmResult AscendClusterTopoParser::InitDynamicModelData(uint64_t serverKey, uint32_t rankId, uint32_t logicDevId, uint32_t phyDevId)202+HcclVmResult AscendClusterTopoParser::InitDynamicModelData(const TopoMeta& topoMeta)
194{203{
195- HCCL_VM_DEBUG("Enter InitDynamicModelData: {}, {}, {}, {}", serverKey, rankId, logicDevId, phyDevId);204+ // 应用通过 aclrtSetDevice(rank % deviceCount) 选择 device,Rank 表需与之匹配
205+ uint32_t rankId = 0;
206+ for (uint32_t superPodIdx = 0; superPodIdx < topoMeta.size(); ++superPodIdx) {
207+ auto superPod = topoMeta[superPodIdx];
208+ for (uint32_t serverIdx = 0; serverIdx < superPod.size(); ++serverIdx) {
209+ auto server = superPod[serverIdx];
210+ auto serverKey = sim::GetServerKeyById(superPodIdx, serverIdx);
211+ uint32_t deviceCount = server.size();
212+ for (uint32_t deviceIdx = 0; deviceIdx < deviceCount; ++deviceIdx) {
213+ // rankId % deviceCount 是应用实际选择的 logicDevId
214+ uint32_t targetLogicDevId = rankId % deviceCount;
215+ // 查找该 server 上 logic_id == targetLogicDevId 的 Device
216+ auto devRet = RunnerDB::GetOneByPred<sim::Device>(
217+ [serverKey, targetLogicDevId](const sim::Device &d) {
218+ return d.server_id == serverKey && d.logic_id == targetLogicDevId;
219+ });
220+ if (!devRet.second) {
221+ HCCL_VM_ERROR("device not found: serverKey={}, logicDevId={}", serverKey, targetLogicDevId);
222+ return HcclVmResult::HCCL_SIM_E_INTERNAL;
223+ }
224+ auto deviceKey = devRet.first.id;
196 225 
197- auto ret = RunnerDB::GetOneByPred<sim::Device>([phyDevId, serverKey](const sim::Device &d) {226+ // 创建 Rank 表记录
198- return d.physical_id == phyDevId && d.server_id == serverKey;227+ sim::Rank rank;
199- });228+ rank.rank_id = rankId;
200- if (!ret.second) {229+ rank.device_id = deviceKey;
201- HCCL_VM_ERROR("cannot find device by physical id {:d}", phyDevId);230+ rank.state = 1;
202- return HCCL_SIM_E_NOT_FOUND;231+ RunnerDB::Add<sim::Rank>(rank);
203- }232+ HCCL_VM_DEBUG("Init Rank: rankId={}, deviceKey={}, logicDevId={}, phyDevId={}",
204- auto deviceKey = ret.first.id;233+ rankId, deviceKey, devRet.first.logic_id, devRet.first.physical_id);
205 234 
206- // 查找serverKey235+ // 初始化该 device 关联的 CCU 资源
207- HCCL_VM_DEBUG("Update one Device: {}, serverKey= {}, logicDevId= {}, phyDevId= {}", deviceKey, serverKey, logicDevId, phyDevId);236+ auto deviceAllCcu = RunnerDB::GetByPred<sim::Ccu>([deviceKey](const sim::Ccu& d) {
208- if (sim::UpdateDeviceLogicId(serverKey, phyDevId, logicDevId) != ACL_SUCCESS) {237+ return d.device_id == deviceKey;
209- HCCL_VM_ERROR("update device logic id by serverKey {:d} failed", serverKey);238+ });
210- return HcclVmResult::HCCL_SIM_E_INTERNAL;239+ if (deviceAllCcu.empty()) {
211- }240+ HCCL_VM_ERROR("get device all ccu failed");
212- // 初始化Rank表241+ return HcclVmResult::HCCL_SIM_E_INTERNAL;
213- sim::Rank rank;242+ }
214- rank.rank_id = rankId;243+ for (const auto& ccu : deviceAllCcu) {
215- rank.device_id = deviceKey;244+ InitCcuResource(ccu.id);
216- rank.state = 1; // 已初始化245+ }
217- RunnerDB::Add<sim::Rank>(rank);
218 246 
219- // 初始化ccu资源表(按照用到的device初始化)247+ rankId++;
220- auto deviceAllCcu = RunnerDB::GetByPred<sim::Ccu>([deviceKey](const sim::Ccu& d) {248+ }
221- return d.device_id == deviceKey;249+ }
222- });
223- if (deviceAllCcu.empty()) {
224- HCCL_VM_ERROR("get device all ccu failed");
225- return HcclVmResult::HCCL_SIM_E_INTERNAL;
226 }250 }
227 251 
228- for (const auto& ccu : deviceAllCcu) {
229- auto ccuKey = ccu.id;
230- InitCcuResource(ccuKey);
231- }
232 return HcclVmResult::HCCL_SIM_SUCCESS;252 return HcclVmResult::HCCL_SIM_SUCCESS;
233}253}
234 254 
@@ -409,7 +429,9 @@ HcclVmResult AscendClusterTopoParser::CreateRankTableFile(const TopoMeta &topoMe
409 429 
410 std::set<int> commDomainLocalIds(serverMeta.begin(), serverMeta.end());430 std::set<int> commDomainLocalIds(serverMeta.begin(), serverMeta.end());
411 431 
412- for (PhyDeviceId phyDevId : serverMeta) {432+ for (uint32_t deviceIdx = 0; deviceIdx < serverMeta.size(); ++deviceIdx) {
433+ uint32_t logicDevId = rankId % serverMeta.size();
434+ PhyDeviceId phyDevId = serverMeta[logicDevId];
413 rankTable["rank_list"].push_back(435 rankTable["rank_list"].push_back(
414 BuildRankEntry(server, phyDevId, commDomainLocalIds, spIdx, srvIdx, rankId));436 BuildRankEntry(server, phyDevId, commDomainLocalIds, spIdx, srvIdx, rankId));
415 rankId++;437 rankId++;
@@ -11,12 +11,16 @@ add_library(log STATIC sim_log.cc sim_yaml_config.cc sim_common_api.cc)
11 11 
12target_include_directories(log PUBLIC12target_include_directories(log PUBLIC
13 ${CMAKE_SOURCE_DIR}/include13 ${CMAKE_SOURCE_DIR}/include
14+ ${ASCEND_CANN_PACKAGE_PATH}/include
15+ ${ASCEND_CANN_PACKAGE_PATH}/include/hccl
14 ${CMAKE_SOURCE_DIR}/third_party16 ${CMAKE_SOURCE_DIR}/third_party
15 ${CMAKE_SOURCE_DIR}/third_party/nlohmann_json17 ${CMAKE_SOURCE_DIR}/third_party/nlohmann_json
16 ${CMAKE_SOURCE_DIR}/third_party/yaml-cpp/include18 ${CMAKE_SOURCE_DIR}/third_party/yaml-cpp/include
17)19)
18 20 
19target_include_directories(log PRIVATE21target_include_directories(log PRIVATE
22+ ${ASCEND_CANN_PACKAGE_PATH}/include
23+ ${ASCEND_CANN_PACKAGE_PATH}/include/hccl
20 ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc24 ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc
21 ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc/runtime25 ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc/runtime
22 ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc/profiling26 ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc/profiling
@@ -15,6 +15,7 @@
15#include <string>15#include <string>
16#include <unistd.h>16#include <unistd.h>
17#include <climits>17#include <climits>
18+#include <map>
18 19 
19static std::string GetExePath()20static std::string GetExePath()
20{21{
@@ -74,3 +75,44 @@ std::string InstallPath::ResolveToInstallRoot(const std::string& relPath)
74 }75 }
75 return GetHcclVmInstallAbsPath() + "/" + relPath;76 return GetHcclVmInstallAbsPath() + "/" + relPath;
76}77}
78+ 
79+static std::map<HcclDataType, std::string> g_DataType2Str = {
80+ {HcclDataType::HCCL_DATA_TYPE_INT8, "INT8"},
81+ {HcclDataType::HCCL_DATA_TYPE_INT16, "INT16"},
82+ {HcclDataType::HCCL_DATA_TYPE_INT32, "INT32"},
83+ {HcclDataType::HCCL_DATA_TYPE_FP16, "FP16"},
84+ {HcclDataType::HCCL_DATA_TYPE_UINT64, "UINT64"},
85+ {HcclDataType::HCCL_DATA_TYPE_UINT8, "UINT8"},
86+ {HcclDataType::HCCL_DATA_TYPE_UINT16, "UINT16"},
87+ {HcclDataType::HCCL_DATA_TYPE_UINT32, "UINT32"},
88+ {HcclDataType::HCCL_DATA_TYPE_FP64, "FP64"},
89+ {HcclDataType::HCCL_DATA_TYPE_BFP16, "BFP16"},
90+ {HcclDataType::HCCL_DATA_TYPE_INT128, "INT128"},
91+ {HcclDataType::HCCL_DATA_TYPE_INT64, "INT64"},
92+ {HcclDataType::HCCL_DATA_TYPE_HIF8, "HIF8"},
93+ {HcclDataType::HCCL_DATA_TYPE_FP8E4M3, "FP8E4M3"},
94+ {HcclDataType::HCCL_DATA_TYPE_FP8E5M2, "FP8E5M2"},
95+};
96+ 
97+static std::map<HcclReduceOp, std::string> g_ReduceOp2Str = {
98+ {HcclReduceOp::HCCL_REDUCE_SUM, "SUM"},
99+ {HcclReduceOp::HCCL_REDUCE_MIN, "MIN"},
100+ {HcclReduceOp::HCCL_REDUCE_MAX, "MAX"},
101+ {HcclReduceOp::HCCL_REDUCE_PROD, "PROD"},
102+};
103+ 
104+std::string GetDataTypeStr(HcclDataType type)
105+{
106+ if (g_DataType2Str.find(type) == g_DataType2Str.end()) {
107+ return "UNKNOWN";
108+ }
109+ return g_DataType2Str[type];
110+}
111+ 
112+std::string GetReduceOpStr(HcclReduceOp op)
113+{
114+ if (g_ReduceOp2Str.find(op) == g_ReduceOp2Str.end()) {
115+ return "UNKNOWN";
116+ }
117+ return g_ReduceOp2Str[op];
118+}
@@ -13,16 +13,6 @@ set(CMAKE_CXX_STANDARD 17)
13set(CMAKE_CXX_STANDARD_REQUIRED True)13set(CMAKE_CXX_STANDARD_REQUIRED True)
14set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -D_GLIBCXX_USE_CXX11_ABI=0")14set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -D_GLIBCXX_USE_CXX11_ABI=0")
15 15 
16-add_subdirectory(cmd)
17-add_subdirectory(device_arm)
18-add_subdirectory(plugin)
19-add_subdirectory(proxy)
20-add_subdirectory(runnerdb)
21-add_subdirectory(store)
22-add_subdirectory(src_root)
23-add_subdirectory(hccl_plugin_manager)
24-add_subdirectory(utils)
25- 
26include_directories(16include_directories(
27 ${CMAKE_CURRENT_SOURCE_DIR}/stub_headers17 ${CMAKE_CURRENT_SOURCE_DIR}/stub_headers
28 ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc18 ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc
@@ -44,5 +34,15 @@ include_directories(
44 ${HCOMM_VM_ROOT_PATH}/src/proxy34 ${HCOMM_VM_ROOT_PATH}/src/proxy
45)35)
46 36 
37+add_subdirectory(cmd)
38+add_subdirectory(device_arm)
39+add_subdirectory(plugin)
40+add_subdirectory(proxy)
41+add_subdirectory(runnerdb)
42+add_subdirectory(store)
43+add_subdirectory(src_root)
44+add_subdirectory(hccl_plugin_manager)
45+add_subdirectory(utils)
46+ 
47enable_testing()47enable_testing()
48add_test(NAME hccl_host_test COMMAND hccl_host_test)48add_test(NAME hccl_host_test COMMAND hccl_host_test)
@@ -23,19 +23,16 @@ set(COMMON_INCLUDE_DIRS
23 ${CMAKE_SOURCE_DIR}/third_party/CLI1123 ${CMAKE_SOURCE_DIR}/third_party/CLI11
24 ${CMAKE_BINARY_DIR}/_deps/yaml-cpp-src/include24 ${CMAKE_BINARY_DIR}/_deps/yaml-cpp-src/include
25 ${CMAKE_SOURCE_DIR}/third_party25 ${CMAKE_SOURCE_DIR}/third_party
26- $ENV{HCCL_CODE_HOME}/src/ops/op_common/inc26+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/include/driver
27- $ENV{HCCL_CODE_HOME}/src/common27+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc/driver
28- $ENV{HCCL_CODE_HOME}/src/common/hcomm_dlsym28+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc/runtime
29- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/include/driver29+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc/toolchain
30- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/pkg_inc/driver30+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc/profiling
31- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/pkg_inc/runtime31+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc
32- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/pkg_inc/toolchain32+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc/hccl
33- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/pkg_inc/profiling33+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc/base
34- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/pkg_inc34+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/include
35- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/pkg_inc/hccl35+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/include/hccl
36- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/pkg_inc/base
37- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/include
38- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/include/hccl
39 36 
40 ${HCOMM_CODE_ROOT}/src/base_comm/resources/ccu/ccu_microcode37 ${HCOMM_CODE_ROOT}/src/base_comm/resources/ccu/ccu_microcode
41)38)
@@ -21,19 +21,16 @@ set(COMMON_INCLUDE_DIRS
21 ${CMAKE_SOURCE_DIR}/third_party/CLI1121 ${CMAKE_SOURCE_DIR}/third_party/CLI11
22 ${CMAKE_BINARY_DIR}/_deps/yaml-cpp-src/include22 ${CMAKE_BINARY_DIR}/_deps/yaml-cpp-src/include
23 ${CMAKE_SOURCE_DIR}/third_party/nlohmann_json23 ${CMAKE_SOURCE_DIR}/third_party/nlohmann_json
24- $ENV{HCCL_CODE_HOME}/src/ops/op_common/inc24+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/include/driver
25- $ENV{HCCL_CODE_HOME}/src/common25+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc/driver
26- $ENV{HCCL_CODE_HOME}/src/common/hcomm_dlsym26+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc/runtime
27- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/include/driver27+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc/toolchain
28- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/pkg_inc/driver28+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc/profiling
29- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/pkg_inc/runtime29+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc
30- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/pkg_inc/toolchain30+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc/hccl
31- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/pkg_inc/profiling31+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/pkg_inc/base
32- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/pkg_inc32+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/include
33- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/pkg_inc/hccl33+ ${ASCEND_CANN_PACKAGE_PATH}/${CANN_ARCH_DIR}/include/hccl
34- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/pkg_inc/base
35- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/include
36- $ENV{ASCEND_TOOLKIT_HOME}/${CANN_ARCH_DIR}/include/hccl
37 ${HCOMM_CODE_ROOT}/src/base_comm/resources/ccu/ccu_microcode34 ${HCOMM_CODE_ROOT}/src/base_comm/resources/ccu/ccu_microcode
38)35)
39 36 
@@ -116,7 +116,7 @@ TEST_F(SimRunnerCommonTest, GetDeviceByPhysicalId_WhenDeviceNotExists_ReturnErro
116 116 
117TEST_F(SimRunnerCommonTest, UpdateDeviceLogicId_WhenValidParams_UpdateSuccessfully)117TEST_F(SimRunnerCommonTest, UpdateDeviceLogicId_WhenValidParams_UpdateSuccessfully)
118{118{
119- auto ret = sim::UpdateDeviceLogicId(1, 0, 100);119+ auto ret = sim::UpdateDeviceLogicId(1, 0, 100, 0);
120 120 
121 EXPECT_EQ(ret, ACL_SUCCESS);121 EXPECT_EQ(ret, ACL_SUCCESS);
122 122 
@@ -128,14 +128,14 @@ TEST_F(SimRunnerCommonTest, UpdateDeviceLogicId_WhenValidParams_UpdateSuccessful
128 128 
129TEST_F(SimRunnerCommonTest, UpdateDeviceLogicId_WhenServerKeyInvalid_ReturnError)129TEST_F(SimRunnerCommonTest, UpdateDeviceLogicId_WhenServerKeyInvalid_ReturnError)
130{130{
131- auto ret = sim::UpdateDeviceLogicId(999, 0, 100);131+ auto ret = sim::UpdateDeviceLogicId(999, 0, 100, 0);
132 132 
133 EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);133 EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
134}134}
135 135 
136TEST_F(SimRunnerCommonTest, UpdateDeviceLogicId_WhenPhyDevIdInvalid_ReturnError)136TEST_F(SimRunnerCommonTest, UpdateDeviceLogicId_WhenPhyDevIdInvalid_ReturnError)
137{137{
138- auto ret = sim::UpdateDeviceLogicId(1, 999, 100);138+ auto ret = sim::UpdateDeviceLogicId(1, 999, 100, 0);
139 139 
140 EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);140 EXPECT_EQ(ret, ACL_ERROR_INVALID_PARAM);
141}141}
@@ -18,6 +18,9 @@ include_directories(
18 ${CMAKE_SOURCE_DIR}/third_party18 ${CMAKE_SOURCE_DIR}/third_party
19 ${CMAKE_SOURCE_DIR}/third_party/nlohmann_json19 ${CMAKE_SOURCE_DIR}/third_party/nlohmann_json
20 ${CMAKE_SOURCE_DIR}/third_party/yaml-cpp/include20 ${CMAKE_SOURCE_DIR}/third_party/yaml-cpp/include
21+ ${CMAKE_SOURCE_DIR}/third_party/spdlog
22+ ${ASCEND_CANN_PACKAGE_PATH}/include
23+ ${ASCEND_CANN_PACKAGE_PATH}/include/hccl
21)24)
22 25 
23link_libraries(26link_libraries(