
多实例支持【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem概述SHMEM 多实例能力允许在单个进程内创建多个独立 SHMEM 实例。每个实例拥有独立的通信域、内存空间和同步资源适用于以下场景多通信域共存单个进程中多个任务域需要独立 SHMEM 上下文资源隔离不同任务/模块之间隔离 SHMEM 资源避免相互干扰弹性扩缩不同实例创建/释放互不影响动态实例管理运行时按instance_id创建/释放实例核心概念实例Instance一个 SHMEM 实例包含一组完整初始化状态典型包括独立的通信域Team World独立的共享内存堆Heap独立的同步资源Sync Pool/Counter独立的 State/Bootstrap/MemoryManager 运行时快照实例标识Instance ID当前仓库使用instance_iduint64_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│ │ │ │ │ │ │ └───────┘ │ │ └───────┘ │ │ └──────┘ │ │ │ │ │ └─────────────┘ └─────────────┘ └────────────┘ │ │ │ └────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────┘关键设计决策设计点当前实现方案说明实例隔离独立aclshmem_context快照每个实例保存独立的state、host_state、boot_handle、memory_manager等Context 管理全局变量 swap通过aclshmemx_instance_ctx_set切换实例标识instance_id(uint64_t)位于aclshmemx_init_attr_t并用于aclshmemx_finalize(instance_id)Device 侧路由instance_id 1kernel 侧通过 硬编码地址 访问对应实例的state规格与限制按代码实现项目规格instance_id类型uint64_t默认实例instance_id 0实例个数上限255PE 上限ACLSHMEM_MAX_PES 16384本地内存上限ACLSHMEM_MAX_LOCAL_SIZE 40GB实例共享内存上限目前为128GB 超过128GB时底层虚拟地址冲突非 0 实例 Team 行为初始化时仅保留 world team 槽位team split/translate/get_config 等返回ACLSHMEM_NOT_SUPPORTEDdefault 多实例端口分配依赖环境变量SHMEM_INSTANCE_PORT_RANGEstart:end(start、end由用户自行指定每个实例用到的实际端口为start_port instance_id)通信链路支持目前仅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。实例上下文相关接口路径由互斥锁保护。快速上手当前仓库 API1. 创建实例#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. 切换到目标实例 Contextaclshmemx_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 释放指定实例内部会自动切换上下文无需手动 setaclshmemx_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与单实例模式对比特性单实例模式多实例模式初始化标识默认instance_id0instance_id0资源隔离全局共享按实例隔离上下文切换不需要需要aclshmemx_instance_ctx_set生命周期管理aclshmem_finalize()aclshmemx_finalize(instance_id)Team 高级操作支持仅instance_id0支持相关代码与文档初始化/终止流程含多实例 ctx 创建、端口分配与 finalizeinit_finalize.mdHost 多实例切换src/host/init/shmem_init.cppDevice 多实例切换src/device/shmemi_device_common.hppTeam 多实例限制逻辑src/host/team/shmem_team.cpp对应示例examples/multi_instance最后更新2026-07-03【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考