# SHMEM
**Repository Path**: ascend/shmem
## Basic Information
- **Project Name**: SHMEM
- **Description**: 本系统主要面向昇腾平台上的模型和算子开发者,提供便携易用的多机多卡内存访问方式,方便用户开发在卡间同步数据,加速通信或通算融合类算子开发。
- **Primary Language**: C++
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 12
- **Forks**: 80
- **Created**: 2025-03-18
- **Last Updated**: 2026-01-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
SHMEM
===
🔥 [2025/10] SHMEM项目首次上线。
## 一、什么是SHMEM
### 介绍
本系统主要面向昇腾平台上的模型和算子开发者,提供便携易用的多机多卡内存访问方式,方便用户开发在卡间同步数据,加速通信或通算融合类算子开发。
### 软件架构
共享内存库接口主要分为host和device接口部分:
- host侧接口提供初始化、内存管理、通信域管理以及同步功能。
- device侧接口提供内存访问、同步以及通信域管理功能。
### 目录结构说明
详细介绍见[code_organization](docs/code_organization.md)
```
├── 3rdparty // 依赖的第三方库
├── docs // 文档
├── examples // 使用样例
├── include // 头文件
├── scripts // 相关脚本
├── src // 源代码
└── tests // 测试用例
```
## 二、环境构建
### 软件硬件配套说明
- 硬件型号支持
- Atlas 800I A2/A3 系列产品
- Atlas 800T A2/A3 系列产品
- 平台:aarch64/x86
- 配套软件:驱动固件 Ascend HDK 25.0.RC1.1、 CANN 8.2.RC1及之后版本。
cmake >= 3.19
GLIBC >= 2.28
### 快速安装CANN软件
本节提供快速安装CANN软件的示例命令,更多安装步骤请参考[详细安装指南](#cann详细安装指南)。
#### 安装前准备
在线安装和离线安装时,需确保已具备Python环境及pip3,当前CANN支持Python3.7.x至3.11.4版本。
离线安装时,请单击[获取链接](https://www.hiascend.com/developer/download/community/result?module=cann)下载CANN软件包,并上传到安装环境任意路径。
#### 安装CANN
```shell
chmod +x Ascend-cann-toolkit_8.2.RC1_linux-$(arch).run
./Ascend-cann-toolkit_8.2.RC1_linux-$(arch).run --install
```
#### 安装后配置
配置环境变量脚本set_env.sh,当前安装路径以${HOME}/Ascend为例。
```
source ${HOME}/Ascend/ascend-toolkit/set_env.sh
```
安装业务运行时依赖的Python第三方库(如果使用root用户安装,请将命令中的--user删除)。
```
pip3 install attrs cython 'numpy>=1.19.2,<=1.24.0' decorator sympy cffi pyyaml pathlib2 psutil protobuf==3.20.0 scipy requests absl-py --user
```
### CANN详细安装指南
开发者可访问[昇腾文档-昇腾社区](https://www.hiascend.com/document)->CANN社区版->软件安装,查看CANN软件安装引导,根据机器环境、操作系统和业务场景选择后阅读详细安装步骤。
## 三、快速上手
### SHMEM编译
- 设置CANN环境变量
```sh
# root用户安装(默认路径)
source /usr/local/Ascend/ascend-toolkit/set_env.sh
```
- 共享内存库编译
编译共享内存库,设置共享内存库环境变量:
```sh
cd shmem
bash scripts/build.sh
source install/set_env.sh
```
- run包使用
软件包名为:SHMEM_{version}_linux-{arch}.run
其中,{version}表示软件版本号,{arch}表示CPU架构。
安装run包(需要依赖cann环境)
```sh
chmod +x 软件包名.run # 增加对软件包的可执行权限
./软件包名.run --check # 校验软件包安装文件的一致性和完整性
./软件包名.run --install # 安装软件,可使用--help查询相关安装选项
```
出现提示`xxx install success!`则安装成功
注意:shmem 默认开启tls通信加密。如果需要关闭,需要调用接口主动关闭:
```c
int32_t ret = shmem_set_conf_store_tls(false, null, 0);
```
具体细节详见安全声明章节
### 执行样例算子Demo
以执行一个样例matmul_allreduce算子Demo为例:
1. 在源码shmem/目录编译:
```sh
bash scripts/build.sh -examples
```
2. 在shmem/examples/matmul_allreduce目录执行demo:
```sh
bash scripts/run.sh -ranks 2 -M 1024 -K 2048 -N 8192
```
注意:example及其他样例代码仅供参考,在生产环境中请谨慎使用。
### 功能自测用例
共享内存库接口单元测试,在工程目录下执行
```sh
bash scripts/build.sh -uttests
bash scripts/run.sh
```
run.sh脚本提供-ranks -ipport -test_filter等参数自定义执行用例的卡数、ip端口、gtest_filter等,例如:
```sh
# 8卡,ip:port 127.0.0.1:8666,运行所有*Init*用例
bash scripts/run.sh -ranks 8 -ipport tcp://127.0.0.1:8666 -test_filter Init
```
### python侧test用例
注意:python接口API列表可参考:[python接口API列表](./docs/pythonAPI.md)。
1. 在scripts目录下编译的时候,带上build python的选项
```sh
bash build.sh -python_extension
```
2. 在install目录下,source环境变量
```sh
source set_env.sh
```
3. 在src/python目录下,进行setup,获取到wheel安装包
```sh
python3 setup.py bdist_wheel
```
4. 在src/python/dist目录下,安装wheel包
```sh
pip3 install shmem-xxx.whl --force-reinstall
```
5. 设置是否开启TLS认证,默认开启,若关闭TLS认证,请使用如下接口
```python
import shmem as shm
shm.set_conf_store_tls(False, "") # 关闭tls认证
```
```python
import shmem as shm
tls_info = "xxx"
shm.set_conf_store_tls(True, tls_info) # 开启TLS认证
```
6. 使用torchrun运行测试demo
```sh
torchrun --nproc-per-node=k test.py // k为想运行的ranksize
```
看到日志中打印出“test.py running success!”即为demo运行成功
## 四、在样例工程使用调测功能
### cce::printf
#### 介绍
在example及其他样例代码中可使用设备侧打印函数`cce::printf`功能,用法与C标准库的printf一致。
#### 开启方法
若想使用该功能需要修改`examples\CMakeLists.txt`,为`target_compile_options`添加编译选项`--cce-enable-print`。
注意:cce::printf功能为编译器侧提供的能力,仅在CANN 8.2 T103版本支持,若您不想安装该版本的CANN,可使用[Ascend C算子调测API](#ascend-c算子调测api)提供的方法。
### Ascend C算子调测API
AscendC算子调测API是AscendC提供的调试能力,可进行kernel内部的打印、Tensor内容的查看(Dump)。
关于kernel调测api的详细介绍,可参考[DumpTensor](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/83RC1alpha003/API/ascendcopapi/atlasascendc_api_07_0192.html)和[printf](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/83RC1alpha003/API/ascendcopapi/atlasascendc_api_07_0193.html)。
#### 插入调试代码
1. 修改使用该功能的核函数入口和相关调用代码,增加开启调测功能(`#if defined(ENABLE_ASCENDC_DUMP)`)的编译时代码,具体可参考`examples/matmul_allreduce/main.cpp`。
2. 在想进行调试的层级,增加调测API调用。
```diff
// examples/matmul_allreduce/kernel/matmul_epilogue_comm.hpp
template <>
__forceinline__ __aicore__
void operator()(Params ¶ms)
{
BlockScheduler matmulBlockScheduler(params.problemShape, MakeCoord(L1TileShape::M, L1TileShape::N));
uint32_t coreLoops = matmulBlockScheduler.GetCoreLoops();
BlockMmad blockMmad(resource);
// Represent the full gm
AscendC::GlobalTensor gmA;
gmA.SetGlobalBuffer((__gm__ ElementA *)params.ptrA);
AscendC::GlobalTensor gmB;
gmB.SetGlobalBuffer((__gm__ ElementB *)params.ptrB);
+ AscendC::printf("coreLoops is %d\n", coreLoops);
+ AscendC::DumpTensor(gmA, coreLoops, 16);
...
}
```
#### 编译运行
1. 打开工具的编译开关`-enable_ascendc_dump`, 使能AscendC算子调测API编译算子样例。
```sh
bash scripts/build.sh -enable_ascendc_dump -examples
```
2. 在shmem/examples/matmul_allreduce目录执行demo:
```sh
bash scripts/run.sh -ranks 2 -M 1024 -K 2048 -N 8192
```
- ⚠ 注意事项
- 目前`AscendC算子调测API`**不**支持打印`FixPipe`上的数值。
## 五、贡献
### 贡献者列表
- [华南理工大学 陆璐教授团队](https://www2.scut.edu.cn/cs/2017/0629/c22284a328108/page.htm)
### 参与贡献指南
1. fork仓库 & 修改并提交代码
1. 新建 Pull-Request
详细步骤可参考[贡献指南](docs/CONTRIBUTING.md)
## 六、学习资源
- [api_demo](docs/api_demo.md):api调用示例
- [code_organization](docs/code_organization.md):
- [example](docs/example.md):AllGather算子demo
- [quickstart](docs/quickstart.md):编译运行流程说明
- [related_scripts](docs/related_scripts.md):相关脚本介绍
- [pythonAPI](docs/pythonAPI.md):SHMEM对外接口说明
- [Troubleshooting_FAQs](docs/Troubleshooting_FAQs.md):使用限制&常见问题
- [CONTRIBUTING](docs/CONTRIBUTING.md):如何向SHMEM贡献代码
## 七、参考文档
- **[CANN社区版文档](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/83RC1alpha002/index/index.html)**
- **[SHMEM文档](https://shmem-doc.pages.dev/)**