| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 27 天前 |
UBS Memory共享内存样例
一、Cache模式共享内存样例
功能说明
01_cache_shmem.cpp使用UBSM_FLAG_CACHE创建128MB共享内存,并依次完成:
- 初始化UBS Memory SDK。
- 在
default共享域创建共享内存。 - 将共享内存以
PROT_NONE映射到本进程。 - 获取读写权限并写入数据。
- 释放权限,通过
ubsmem_shmem_set_ownership(..., PROT_NONE)刷新并失效cache。 - 获取只读权限并校验数据。
- 解除映射、删除共享内存并释放SDK资源。
环境要求
- openEuler 24.03 LTS SP3或更高版本。
- 已安装并启动UBS Engine和
ubsmd。 - 服务器具有可用的UB硬件,且BIOS未配置snoop参数。
- 当前用户属于
ubsmd和ubse用户组,并具有UBSE的mem.shm接口权限。 - 已安装UBS Memory SDK头文件和动态库。
编译
cmake -S example -B example/build
cmake --build example/build --target 01_cache_shmem
如果SDK安装在非默认目录,通过UBSM_ROOT指定安装前缀:
cmake -S example -B example/build -DUBSM_ROOT=/path/to/ubs_mem
cmake --build example/build --target 01_cache_shmem
运行
./example/build/01_cache_shmem
程序使用进程ID生成全局共享内存名称,成功时输出读取到的字符串,并在退出前解除映射和删除共享内存。 任一步骤失败时,程序会输出UBS Memory错误码并尽最大努力清理已创建资源。
二、共享内存连续拼接样例
功能说明
02_contiguous_shmem.cpp根据输入的节点数量,将多个128MB共享内存映射到一段连续的虚拟地址空间,
并依次完成:
- 通过
ubsmem_shmem_allocate_with_provider()在每个指定节点上创建一个非cache、非接力共享内存。 - 使用匿名
mmap()预留一段大小为host_num * 128MB的连续虚拟地址空间。 - 使用
MAP_SHARED | MAP_FIXED将所有共享内存依次映射到预留空间。 - 使用不同的字节值对每个分段执行整段
memset(),再次逐字节遍历所有分段并校验数据,同时输出各分段的 地址范围。 - 按相反顺序解除映射、删除共享内存并释放SDK资源。
警告
程序先通过mmap()申请一段连续的空闲地址,再使用MAP_FIXED将多个共享内存依次映射到这段地址中。
MAP_FIXED会先解除目标地址范围内原有的映射。样例中的目标地址是专门为拼接共享内存预留的,请勿使用
存放其他数据的地址。
环境要求
- openEuler 24.03 LTS SP3或更高版本。
- 已安装并启动UBS Engine和
ubsmd。 - 服务器具有可用的UB硬件。
- 当前用户属于
ubsmd和ubse用户组,并具有UBSE的mem.shm接口权限。 - 已安装UBS Memory SDK头文件和动态库。
- 指定的hostname均为可访问的共享内存提供节点,且每个节点至少有128MB可用共享内存。
编译
cmake -S example -B example/build
cmake --build example/build --target 02_contiguous_shmem
如果SDK安装在非默认目录,通过UBSM_ROOT指定安装前缀:
cmake -S example -B example/build -DUBSM_ROOT=/path/to/ubs_mem
cmake --build example/build --target 02_contiguous_shmem
运行
参数格式为<host_num> <host_0> ... <host_n>,其中n = host_num - 1,host_num取值范围为1到16
(MAX_HOST_NUM)。后续hostname参数数量必须与host_num一致。例如,拼接四个节点提供的共享内存:
./example/build/02_contiguous_shmem 4 provider-0 provider-1 provider-2 provider-3
成功时程序会输出所有共享内存名称和连续的地址范围,例如:
segment[0] 0x7f0000000000-0x7f0008000000: pattern=0x01
segment[1] 0x7f0008000000-0x7f0010000000: pattern=0x02
segment[2] 0x7f0010000000-0x7f0018000000: pattern=0x03
segment[3] 0x7f0018000000-0x7f0020000000: pattern=0x04
实际地址由操作系统选择。共享内存名称由进程ID和分段编号生成;样例退出时会尽最大努力解除映射并删除 所有对象。