多实例支持
概述
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 侧通过 硬编码地址 访问对应实例的 |
快速上手(当前仓库 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. 释放实例
aclshmem_finalize(2);
也可直接参照examples/multi_instance目录
规格与限制(按代码实现)
项目 |
规格 |
|---|---|
|
|
默认实例 |
|
PE 上限 |
|
本地内存上限 |
|
非 0 实例 Team 行为 |
初始化时仅保留 world team 槽位;team split/translate/get_config 等返回 |
|
|
default 多实例端口范围 |
依赖 |
default 端口分配规则 |
输入端口必须是 |
default 可用实例 ID 范围 |
|
环境变量与运行要求
Kernel侧使用要求
编译时必须类似
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日志提示并立即返回(不会重复创建)。aclshmem_finalize(instance_id)会先切换到目标实例,再执行释放,避免误释放。实例上下文相关接口路径由互斥锁保护。
与单实例模式对比
特性 |
单实例模式 |
多实例模式 |
|---|---|---|
初始化标识 |
默认 |
|
资源隔离 |
全局共享 |
按实例隔离 |
上下文切换 |
不需要 |
需要 |
生命周期管理 |
|
|
Team 高级操作 |
支持 |
仅 |
相关代码与文档
Host 初始化与多实例实现:
src/host/init/shmem_init.cppDevice 多实例状态路由:
src/device/shmemi_device_common.hppTeam 多实例限制逻辑:
src/host/team/shmem_team.cpp对应示例:
examples/multi_instance
最后更新:2026-03-25