多实例支持
概述
SHMEM 多实例能力允许在单个进程内创建多个独立 SHMEM 实例。每个实例拥有独立的通信域、内存空间和同步资源,适用于以下场景:
多通信域共存:单个进程中多个任务域需要独立 SHMEM 上下文。
资源隔离:不同任务/模块之间隔离 SHMEM 资源,避免相互干扰。
弹性扩缩:不同实例创建/释放互不影响。
动态实例管理:运行时按
instance_id创建/释放实例。
核心概念
实例(Instance)
一个 SHMEM 实例包含一组完整初始化状态,典型包括:
独立的通信域(
Team World)。独立的共享内存堆(
Heap)。独立的同步资源(
Sync Pool/Counter)。独立的 State/Bootstrap/MemoryManager 运行时快照。
实例标识(Instance ID)
当前仓库使用 instance_id(uint64_t)标识实例。实例生命周期由初始化属性和 finalize 接口管理。
Context 切换
SHMEM 通过全局变量 swap 机制完成实例切换:切换时先回写当前实例的全局状态,再装载目标实例的全局状态。
架构设计
┌──────────────────────────────────────────────────────────┐
│ Process │
│ ┌────────────────────────────────────────────────────┐ │
│ │ SHMEM Runtime │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌────────────┐ │ │
│ │ │ Instance 0 │ │ Instance 1 │ │ Instance N │ │ │
│ │ │ ┌───────┐ │ │ ┌───────┐ │ │ ┌──────┐ │ │ │
│ │ │ │ Team │ │ │ │ Team │ │ │ │ Team │ │ │ │
│ │ │ │ Heap │ │ │ │ Heap │ │ │ │ Heap │ │ │ │
│ │ │ │ Sync │ │ │ │ Sync │ │ │ │ Sync │ │ │ │
│ │ │ │ State │ │ │ │ State │ │ │ │ State│ │ │ │
│ │ │ └───────┘ │ │ └───────┘ │ │ └──────┘ │ │ │
│ │ └─────────────┘ └─────────────┘ └────────────┘ │ │
│ └────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
关键设计决策
设计点 |
当前实现方案 |
说明 |
|---|---|---|
实例隔离 |
独立 |
每个实例保存独立的 |
Context 管理 |
全局变量 swap |
通过 |
实例标识 |
|
位于 |
Device 侧路由 |
|
kernel 侧通过硬编码地址访问对应实例的 |
规格与限制(按代码实现)
项目 |
规格 |
|---|---|
|
|
默认实例 |
|
实例个数上限 |
|
PE 上限 |
|
本地内存上限 |
|
实例共享内存上限 |
目前为128GB, 超过128GB时底层虚拟地址冲突 |
非 0 实例 Team 行为 |
初始化时仅保留 world team 槽位;team split/translate/get_config 等返回 |
default 多实例端口分配 |
依赖环境变量 |
通信链路支持 |
目前仅MTE |
环境变量与运行要求
算子侧使用要求
编译时必须类似
add_compile_definitions(MULTI_INSTANCE)添加MULTI_INSTANCE编译宏。多实例使用时必须在算子开头使用
aclshmemx_instance_ctx_set(id)来指定当前实例。算子执行时可以做实例间切换。
default 多实例模式
必须设置
SHMEM_INSTANCE_PORT_RANGE,格式start:end。初始化属性中的
ip_port端口必须为0,例如(attr.ip_port = "tcp://x.x.x.x:0")。
unique id 模式
仍遵循现有
SHMEM_UID_SESSION_ID/SHMEM_UID_SOCK_IFNAME规则。
注意事项
重复创建同一
instance_id时:会有WARN日志提示并立即返回(不会重复创建)。aclshmemx_finalize(instance_id)仅在目标实例非当前活动实例时才切换上下文,再执行释放;传入不存在的instance_id会返回错误,不会误伤当前活动实例。aclshmem_finalize()释放当前活动实例,不会切换上下文;多实例下需配合aclshmemx_instance_ctx_set使用,或直接改用aclshmemx_finalize。实例上下文相关接口路径由互斥锁保护。
快速上手(当前仓库 API)
1. 创建实例
#include "shmem.h"
aclshmemx_init_attr_t attr;
attr.my_pe = pe_id;
attr.n_pes = pe_size;
attr.local_mem_size = 1024UL * 1024UL * 1024UL;
attr.ip_port = "tcp://x.x.x.x:0" // 预先置为0,后续会分配
attr.comm_args = nullptr; // default mode
attr.instance_id = 2;
int ret = aclshmemx_init_attr(ACLSHMEMX_INIT_WITH_DEFAULT, &attr);
2. 切换到目标实例 Context
aclshmemx_instance_ctx_set(2);
// 后续 SHMEM API 均作用于实例 2
void *ptr = aclshmem_malloc(1024);
aclshmem_free(ptr);
3. 获取当前实例
aclshmem_instance_ctx *ctx = aclshmemx_instance_ctx_get();
// 当前主要用于读取 id,其他能力见上一节
uint64_t cur_id = (ctx == nullptr) ? 0 : ctx->id;
4. 释放实例
多实例场景推荐直接使用 aclshmemx_finalize,按 id 释放指定实例(内部会自动切换上下文,无需手动 set):
aclshmemx_finalize(2);
也可以用标准接口 aclshmem_finalize() 释放当前活动实例(即最近一次 aclshmemx_instance_ctx_set 设置的实例,未 set 过则为 instance 0)。若要用它释放某个特定实例,需先 set 再调用:
aclshmemx_instance_ctx_set(2);
aclshmem_finalize(); // 释放当前活动实例 2
单实例场景下 aclshmem_finalize() 直接释放 instance 0,与历史无参用法完全一致。
5. 完整样例
examples/multi_instance
与单实例模式对比
特性 |
单实例模式 |
多实例模式 |
|---|---|---|
初始化标识 |
默认 |
|
资源隔离 |
全局共享 |
按实例隔离 |
上下文切换 |
不需要 |
需要 |
生命周期管理 |
|
|
Team 高级操作 |
支持 |
仅 |
相关代码与文档
初始化/终止流程(含多实例 ctx 创建、端口分配与 finalize):init_finalize.md
Host 多实例切换:src/host/init/shmem_init.cpp
Device 多实例切换:src/device/shmemi_device_common.hpp
Team 多实例限制逻辑:src/host/team/shmem_team.cpp
对应示例:examples/multi_instance
最后更新:2026-07-03