已合并
feat(mc2): add src/cc skeleton for hccl migration (PR#1/5) #248
feat(mc2): add src/cc skeleton for hccl migration (PR#1/5) #248
已合并
liuyiming创建于 21 天前
共 4 个文件变更+293-0
@@ -20,6 +20,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
20 20 
21option(ASCCOMM_BUILD_CCU "Build asc-comm CCU library" ON)21option(ASCCOMM_BUILD_CCU "Build asc-comm CCU library" ON)
22option(ASCCOMM_BUILD_AICPU "Build asc-comm AICPU data plane library" ON)22option(ASCCOMM_BUILD_AICPU "Build asc-comm AICPU data plane library" ON)
23+option(ASCCOMM_BUILD_MC2 "Build MC2 communication client library (migrated from asc-devkit hccl)" OFF)
suqwe
suqwesuqwe19 天前

🤖 CANN 检视意见

严重性: ⚠️ Medium 置信度: ✅ 较确定 问题类别: 测试覆盖 / CI 门禁 问题详情: ASCCOMM_BUILD_MC2 默认 OFF 可以避免影响存量构建,但本 PR 的核心交付物正是这个默认关闭的骨架 target。PR 中未提交显式开启该选项的 CI/build 入口,因此默认流水线通过并不能证明 mc2_client 及其链接配置被验证过。对于“只有 CMake、暂无真实源文件”的拆分式迁移,这一点尤其需要门禁兜底。 修改建议: 增加一个显式执行 cmake -DASCCOMM_BUILD_MC2=ON 并构建 mc2_client 的 CI smoke job,或接入现有构建脚本的可选矩阵;至少在迁移说明中固化本次手工验证命令,并在系列 PR 完成前保持为必跑门禁。

likedislike
liuyiming
liuyiming
19 天前 评论:
23 24 
24if(CUSTOM_ASCEND_CANN_PACKAGE_PATH)25if(CUSTOM_ASCEND_CANN_PACKAGE_PATH)
25 set(_ASCCOMM_CANN_PACKAGE_PATH "${CUSTOM_ASCEND_CANN_PACKAGE_PATH}")26 set(_ASCCOMM_CANN_PACKAGE_PATH "${CUSTOM_ASCEND_CANN_PACKAGE_PATH}")
@@ -54,3 +55,7 @@ endif()
54if(ASCCOMM_BUILD_AICPU)55if(ASCCOMM_BUILD_AICPU)
55 add_subdirectory(src/aicpu)56 add_subdirectory(src/aicpu)
56endif()57endif()
58+ 
59+if(ASCCOMM_BUILD_MC2)
60+ add_subdirectory(src/cc)
61+endif()
@@ -0,0 +1,13 @@
1+<!--
2+Copyright (c) 2026 Huawei Technologies Co., Ltd.
3+This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4+CANN Open Software License Agreement Version 2.0 (the "License").
5+See LICENSE in the root of the software repository for the full text of the License.
6+-->
7+ 
8+# CC Public API Headers
9+ 
10+This directory is the migration target of `include/adv_api/hccl`
11+from asc-devkit (see Issue #66 for the migration plan). It keeps the source
12+sub-directory layout and will expose the user-facing `hccl.h` plus the
13+internal headers after migration.
@@ -0,0 +1,248 @@
1+# ----------------------------------------------------------------------------------------------------------
2+# Copyright (c) 2026 Huawei Technologies Co., Ltd.
3+# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4+# CANN Open Software License Agreement Version 2.0 (the "License").
5+# Please refer to the License for details. You may not use this file except in compliance with the License.
6+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7+# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8+# See LICENSE in the root of the software repository for the full text of the License.
9+# ----------------------------------------------------------------------------------------------------------
10+ 
11+# MC2 communication client (migrated from asc-devkit impl/adv_api/detail/hccl/cc) host-mode skeleton.
12+# 本文件是 MC2 迁移的构建接线点(迁移系列计划跟踪于 Issue #66):首期只接线骨架,源列表随后续模块迁入逐步填充。
13+ 
14+set(HCCL_CC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
15+set(ASCCOMM_MC2_PRODUCT_SIDE "host" CACHE STRING
suqwe
suqwesuqwe19 天前

🤖 CANN 检视意见

严重性: ⚠️ Medium 置信度: ✅ 较确定 问题类别: CMake 输入校验 / 构建可用性 问题详情: ASCCOMM_MC2_PRODUCT_SIDE 的说明中暴露了 device,但当前实现只有 host 分支。设置为 device 或任何非 host 值时,整个 target 定义会被跳过;即使 ASCCOMM_BUILD_MC2=ON,CMake 仍可能配置成功且不生成 mc2_client,用户很容易误以为构建通过。非法值同样没有报错。 修改建议: device 未实现前建议不要在 cache 字符串中暴露;或者配置期严格校验取值,未支持/非法值直接 FATAL_ERROR,至少对 device 输出明确的未支持提示。也可以用 set_property(CACHE ASCCOMM_MC2_PRODUCT_SIDE PROPERTY STRINGS host) 约束可选值。

likedislike
liuyiming
liuyiming
19 天前 评论:
16+ "MC2 build side: host (default) | device (reserved for later migration stages)")
17+option(MC2_CLIENT_ENABLE_CCU "Build CCU algorithm implementations into mc2_client" ON)
18+ 
19+# devkit 开源构建开关 BUILD_OPEN_PROJECT 对应开放工程,恒 ON,启用 hcomm stub 链接机制
20+set(BUILD_OPEN_PROJECT ON)
21+ 
22+# 本仓 include 目录:按 devkit cc/src/CMakeLists.txt:13-123 平移。
23+# 骨架期多数迁移目录尚不存在,全列后按存在性过滤;后续模块目录迁入即自动生效。
24+set(_ASCCOMM_MC2_REPO_DIRS
25+ ${HCCL_CC_DIR}
26+ ${HCCL_CC_DIR}/impl
27+ ${HCCL_CC_DIR}/common
28+ ${HCCL_CC_DIR}/ccu
29+ ${HCCL_CC_DIR}/src/common
30+ ${HCCL_CC_DIR}/src/common/hcomm_dlsym
31+ ${HCCL_CC_DIR}/src/common/hcomm_dlsym/ccu
32+ 
33+ ${HCCL_CC_DIR}/src/ops
34+ ${HCCL_CC_DIR}/src/ops/op_common
35+ ${HCCL_CC_DIR}/src/ops/op_common/inc
36+ ${HCCL_CC_DIR}/src/ops/op_common/executor
37+ ${HCCL_CC_DIR}/src/ops/op_common/executor/channel
38+ ${HCCL_CC_DIR}/src/ops/op_common/executor/registry
39+ ${HCCL_CC_DIR}/src/ops/op_common/external_alg
40+ ${HCCL_CC_DIR}/src/ops/op_common/selector
41+ ${HCCL_CC_DIR}/src/ops/op_common/template
42+ ${HCCL_CC_DIR}/src/ops/op_common/template/registry
43+ ${HCCL_CC_DIR}/src/ops/op_common/template/aicpu
44+ ${HCCL_CC_DIR}/src/ops/op_common/template/wrapper
45+ ${HCCL_CC_DIR}/src/ops/op_common/template/aiv
46+ ${HCCL_CC_DIR}/src/ops/op_common/template/ccu
47+ ${HCCL_CC_DIR}/src/ops/op_common/template/ccu/kernel
48+ ${HCCL_CC_DIR}/src/ops/op_common/topo
49+ ${HCCL_CC_DIR}/src/ops/interface_graph_mode
50+ 
51+ ${HCCL_CC_DIR}/src/ops/reduce_scatter
52+ ${HCCL_CC_DIR}/src/ops/reduce_scatter/executor
53+ ${HCCL_CC_DIR}/src/ops/reduce_scatter/selector
54+ ${HCCL_CC_DIR}/src/ops/reduce_scatter/template
55+ ${HCCL_CC_DIR}/src/ops/reduce_scatter/template/aicpu
56+ ${HCCL_CC_DIR}/src/ops/reduce_scatter/template/ccu
57+ ${HCCL_CC_DIR}/src/ops/reduce_scatter/template/ccu/kernel
58+ 
59+ ${HCCL_CC_DIR}/src/ops/all_gather
60+ ${HCCL_CC_DIR}/src/ops/all_gather/executor
61+ ${HCCL_CC_DIR}/src/ops/all_gather/selector
62+ ${HCCL_CC_DIR}/src/ops/all_gather/template
63+ ${HCCL_CC_DIR}/src/ops/all_gather/template/aicpu
64+ ${HCCL_CC_DIR}/src/ops/all_gather/template/ccu
65+ ${HCCL_CC_DIR}/src/ops/all_gather/template/ccu/kernel
66+ 
67+ ${HCCL_CC_DIR}/src/ops/all_to_all_v
68+ ${HCCL_CC_DIR}/src/ops/all_to_all_v/executor
69+ ${HCCL_CC_DIR}/src/ops/all_to_all_v/selector
70+ ${HCCL_CC_DIR}/src/ops/all_to_all_v/template
71+ ${HCCL_CC_DIR}/src/ops/all_to_all_v/template/aicpu
72+ ${HCCL_CC_DIR}/src/ops/all_to_all_v/template/ccu
73+ ${HCCL_CC_DIR}/src/ops/all_to_all_v/template/ccu/kernel
74+ 
75+ ${HCCL_CC_DIR}/src/ops/all_reduce
76+ ${HCCL_CC_DIR}/src/ops/all_reduce/executor
77+ ${HCCL_CC_DIR}/src/ops/all_reduce/selector
78+ ${HCCL_CC_DIR}/src/ops/all_reduce/template
79+ ${HCCL_CC_DIR}/src/ops/all_reduce/template/aicpu
80+ ${HCCL_CC_DIR}/src/ops/all_reduce/template/ccu
81+ ${HCCL_CC_DIR}/src/ops/all_reduce/template/ccu/kernel
82+ 
83+ ${HCCL_CC_DIR}/src/ops/kfc_server
84+ ${HCCL_CC_DIR}/src/ops/kfc_server/executor
85+ ${HCCL_CC_DIR}/src/ops/kfc_server/selector
86+ ${HCCL_CC_DIR}/src/ops/kfc_server/template
87+ ${HCCL_CC_DIR}/src/ops/kfc_server/template/ccu
88+ ${HCCL_CC_DIR}/src/ops/kfc_server/template/ccu/kernel
89+ 
90+ # include/cc 承接 devkit include/adv_api/hccl 的公开与 internal 头。internal 头按
91+ # devkit cc/src/CMakeLists.txt:14-22 挂载其子目录
92+ ${PROJECT_SOURCE_DIR}/include/cc
93+ ${PROJECT_SOURCE_DIR}/include/cc/internal
94+ ${PROJECT_SOURCE_DIR}/include/cc/internal/hcomm
95+ ${PROJECT_SOURCE_DIR}/include/cc/internal/hcomm/types
96+ ${PROJECT_SOURCE_DIR}/include/cc/internal/hcomm/hccl
97+ ${PROJECT_SOURCE_DIR}/include/cc/internal/hcomm/pkg_inc/hccl
98+ ${PROJECT_SOURCE_DIR}/include/cc/internal/hcomm/ccu
99+ ${PROJECT_SOURCE_DIR}/include/cc/internal/hcomm/pkg_inc/hcomm/ccu
100+ ${PROJECT_SOURCE_DIR}/include/cc/internal/hcomm/pkg_inc
101+ # 仓根:供 include/cc/... 路径形 include 解析(对齐 devkit ${ASCENDC_DIR})
102+ ${PROJECT_SOURCE_DIR}
103+)
104+ 
105+set(ASCCOMM_MC2_INCLUDE_LIST)
106+foreach(_dir IN LISTS _ASCCOMM_MC2_REPO_DIRS)
107+ if(EXISTS "${_dir}")
108+ list(APPEND ASCCOMM_MC2_INCLUDE_LIST "${_dir}")
109+ endif()
110+endforeach()
111+ 
112+# CANN 包 include(照搬 devkit cc/src/CMakeLists.txt:92-123;目录不存在仅为编译警告)
113+list(APPEND ASCCOMM_MC2_INCLUDE_LIST
114+ ${ASCEND_CANN_PACKAGE_PATH}/include
115+ ${ASCEND_CANN_PACKAGE_PATH}/include/acl
116+ ${ASCEND_CANN_PACKAGE_PATH}/include/ccu
117+ ${ASCEND_CANN_PACKAGE_PATH}/include/hccl
118+ ${ASCEND_CANN_PACKAGE_PATH}/include/hcomm
119+ ${ASCEND_CANN_PACKAGE_PATH}/include/hcomm/ccu
120+ ${ASCEND_CANN_PACKAGE_PATH}/include/base/
121+ ${ASCEND_CANN_PACKAGE_PATH}/include/driver/
122+ ${ASCEND_CANN_PACKAGE_PATH}/include/dump/
123+ ${ASCEND_CANN_PACKAGE_PATH}/include/external/
124+ ${ASCEND_CANN_PACKAGE_PATH}/include/platform/
125+ ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc/
126+ ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc/hccl
127+ ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc/hcomm/ccu
128+ ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc/runtime/
129+ ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc/runtime/runtime/
130+ ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc/aicpu/
131+ ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc/profiling/
132+ ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc/base/
133+ ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc/dump/
134+ ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc/trace/
135+ ${ASCEND_CANN_PACKAGE_PATH}/pkg_inc/mmpa/
136+)
137+ 
138+if(ASCCOMM_MC2_PRODUCT_SIDE STREQUAL "host")
139+ # 源列表随后续模块(common/kfc/ops)迁入填充。骨架期源为空,CMake 禁止无源 add_library,
140+ # 生成空占位 TU 保证 target 成立;设置 ASCCOMM_MC2_CLIENT_SOURCES 后自动替换。
141+ set(ASCCOMM_MC2_CLIENT_SOURCES "")
142+ if(NOT ASCCOMM_MC2_CLIENT_SOURCES)
143+ set(_ASCCOMM_MC2_CLIENT_SKELETON_SRC ${CMAKE_CURRENT_BINARY_DIR}/mc2_client_skeleton.cc)
144+ file(WRITE ${_ASCCOMM_MC2_CLIENT_SKELETON_SRC}
145+ "// mc2_client skeleton placeholder; real sources are wired by later migration PRs\n")
146+ set(ASCCOMM_MC2_CLIENT_SOURCES ${_ASCCOMM_MC2_CLIENT_SKELETON_SRC})
147+ endif()
148+ # __FILE__ 注入:日志只带文件名不带路径(对齐 devkit cc/CMakeLists.txt:34-39)。
149+ # 仅 Makefiles 生成器可用:$(notdir $(abspath ...)) 是 GNU Make 函数语法,
suqwe
suqwesuqwe19 天前

🤖 CANN 检视意见

严重性: ⚠️ Medium 置信度: ✅ 较确定 问题类别: 构建可移植性 / CMake 生成器兼容性 问题详情: 这里直接覆盖 CMAKE_CXX_COMPILE_OBJECT / CMAKE_C_COMPILE_OBJECT,并在编译规则中嵌入了 GNU Make 语法 $(notdir $(abspath <SOURCE>))。该写法依赖 Unix Makefiles 生成器;切换到 Ninja 等其他生成器时 Make 语法不会被展开,__FILE__ 宏可能得到错误内容甚至导致命令异常。另外这是目录级规则,后续同目录新增的 target(如 mc2_client_hcomm_stub)也会受影响。 修改建议: 尽量避免覆盖 CMake 内部编译规则。若目标是日志只显示文件名,优先评估编译器可用的 __FILE_NAME__、-ffile-prefix-map 或保持相对源路径等可移植方案;如果确实必须沿用 Make 展开,请在配置期显式校验 CMAKE_GENERATOR 为 Unix Makefiles,不支持的生成器直接 FATAL_ERROR,避免静默产生错误的 __FILE__。

likedislike
liuyiming
liuyiming
19 天前 评论:
150+ # Ninja 的 rules.ninja 不展开该语法(bad $-escape 解析错误)。
151+ # 其他生成器(Ninja 等)走 CMake 默认编译规则,__FILE__ 为源文件全路径,可构建。
152+ if(CMAKE_GENERATOR MATCHES "Makefiles")
153+ set(CMAKE_CXX_COMPILE_OBJECT
154+ "<CMAKE_CXX_COMPILER> <DEFINES> -D__FILE__='\"$(notdir $(abspath <SOURCE>))\"' -Wno-builtin-macro-redefined <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>"
155+ )
156+ set(CMAKE_C_COMPILE_OBJECT
157+ "<CMAKE_C_COMPILER> <DEFINES> -D__FILE__='\"$(notdir $(abspath <SOURCE>))\"' -Wno-builtin-macro-redefined <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>"
158+ )
159+ endif()
160+ 
161+ add_library(mc2_client SHARED ${ASCCOMM_MC2_CLIENT_SOURCES})
162+ 
163+ # TODO(#66): mc2_server.json 生成(parser_ini.py,devkit cc/src/CMakeLists.txt:248-257)待 ops 模块迁入后接线
164+ 
165+ target_compile_definitions(mc2_client PRIVATE
166+ OPEN_BUILD_PROJECT
167+ _GLIBCXX_USE_CXX11_ABI=0
168+ )
169+ 
170+ target_include_directories(mc2_client PRIVATE
171+ ${ASCCOMM_MC2_INCLUDE_LIST}
172+ )
173+ 
174+ target_compile_definitions(mc2_client PRIVATE
175+ HOST_COMPILE
176+ MC2_CLIENT_ENABLE_CCU=$<BOOL:${MC2_CLIENT_ENABLE_CCU}>
177+ )
178+ 
179+ set_target_properties(mc2_client PROPERTIES
180+ CXX_STANDARD 14
181+ CXX_STANDARD_REQUIRED ON
182+ CXX_EXTENSIONS OFF
183+ )
184+ 
185+ target_compile_options(mc2_client PRIVATE
186+ -Werror
187+ -fno-common
suqwe
suqwesuqwe19 天前

🤖 CANN 检视意见

严重性: ⚠️ Medium 置信度: ✅ 较确定 问题类别: 构建配置正确性 / C++ 标准冲突 问题详情: 仓库根目录已设置 CMAKE_CXX_STANDARD 17,这里又手动给 target 追加 -std=c++14。实际生成的编译命令会同时包含两个标准选项,且 CMake 追加的 -std=gnu++17 位于后面并生效,因此 target 实际按 C++17 编译,而不是这里声明的 C++14。后续迁入代码时,这会掩盖依赖 C++14 语义或误用 C++17 特性的风险。 修改建议: 删除手动 -std=c++14,改用 target 属性明确标准,例如 set_target_properties(mc2_client PROPERTIES CXX_STANDARD 14 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF);如果决定跟随仓库全局标准,则直接移除该选项并在文档中明确 C++17。

likedislike
liuyiming
liuyiming
19 天前 评论:
188+ -fno-strict-aliasing
189+ -pipe
190+ -O3
191+ $<$<CONFIG:Debug>:-g>
192+ -fstack-protector-all
193+ )
194+ 
195+ # 与 src/ccu 先例一致:CANN 包链接库经架构目录解析
196+ target_link_directories(mc2_client PRIVATE
197+ ${ASCCOMM_CANN_ARCH_DIR}/lib64
198+ )
199+ 
200+ target_link_options(mc2_client PRIVATE
201+ -Wl,-z,relro
202+ -Wl,-z,now
203+ -Wl,-z,noexecstack
204+ $<$<CONFIG:Release>:-s>
205+ )
206+ 
207+ if(TARGET mc2_compat)
208+ add_dependencies(mc2_client mc2_compat)
209+ endif()
210+ 
211+ # libhcomm must precede mc2_compat: mc2_compat exports weak fallback wrappers
212+ # that must not preempt real HCOMM symbols during dynamic symbol binding.
213+ if(BUILD_OPEN_PROJECT)
214+ set(MC2_CLIENT_HCOMM_STUB_SRC
215+ ${CMAKE_CURRENT_BINARY_DIR}/mc2_client_hcomm_stub.cc)
216+ file(WRITE ${MC2_CLIENT_HCOMM_STUB_SRC}
217+ "extern \"C\" void __mc2_hcomm_stub(void) {}\n")
218+ add_library(mc2_client_hcomm_stub SHARED
219+ ${MC2_CLIENT_HCOMM_STUB_SRC})
220+ set_target_properties(mc2_client_hcomm_stub PROPERTIES
221+ OUTPUT_NAME hcomm
222+ LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mc2_client_link_stub)
223+ target_link_options(mc2_client_hcomm_stub PRIVATE
224+ -Wl,-soname,libhcomm.so)
225+ 
226+ target_link_libraries(mc2_client PRIVATE
227+ -Wl,--no-as-needed
228+ mc2_client_hcomm_stub
229+ $<$<TARGET_EXISTS:mc2_compat>:mc2_compat>
230+ acl_rt
231+ c_sec
232+ unified_dlog
233+ mmpa
234+ -Wl,--no-as-needed
235+ )
236+ endif()
237+ 
238+ install(TARGETS mc2_client
239+ DESTINATION "${CMAKE_SYSTEM_PROCESSOR}-linux/lib64"
240+ )
241+else()
242+ message(FATAL_ERROR
243+ "ASCCOMM_MC2_PRODUCT_SIDE=${ASCCOMM_MC2_PRODUCT_SIDE} is not supported yet: "
244+ "only 'host' is implemented ('device' is reserved for later migration stages)")
245+endif()
246+ 
247+# 后续 PR 按迁移进度接子目录(对齐 devkit cc/src/CMakeLists.txt:355-363)
248+# 后续迁入顺序(跟踪于 Issue #66):common → aicpu_kfc → ops
@@ -0,0 +1,27 @@
1+<!--
2+Copyright (c) 2026 Huawei Technologies Co., Ltd.
3+This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4+CANN Open Software License Agreement Version 2.0 (the "License").
5+See LICENSE in the root of the software repository for the full text of the License.
6+-->
7+ 
8+# CC Communication Client
9+ 
10+This directory is the migration target of `impl/adv_api/detail/hccl` from
11+asc-devkit (device-side client, host-side `mc2_client` algorithms, KFC server
12+sources, and tiling; see Issue #66 for the migration plan). Modules are
13+migrated in stages: common, aicpu_kfc, then ops.
14+ 
15+## Build & verify (manual)
16+ 
17+MC2 is gated behind `ASCCOMM_BUILD_MC2` (default `OFF`). Until a dedicated CI
18+smoke job is added, run the following commands to build and verify the
19+migration skeleton on an aarch64 + CANN environment:
20+ 
21+```bash
22+cmake -S . -B build -DASCCOMM_BUILD_MC2=ON -DASCCOMM_BUILD_CCU=OFF
23+cmake --build build --target mc2_client mc2_client_hcomm_stub -j
24+```
25+ 
26+Expected artifacts: `libmc2_client.so` and the `libhcomm.so` stub under
27+`build/src/cc/mc2_client_link_stub/`.