Remove unused benchmarks
xDSM 是一套面向跨节点共享内存环境的高性能远程调用运行时。项目以 pthread_create()/pthread_join() 兼容接口为应用入口,将一次远程调用组织为:
pthread_create()
pthread_join()
create -> execute -> shared object access -> result -> join/cleanup
xDSM 将轻量控制路径与业务数据路径分离。控制消息只携带函数入口、参数地址和必要 的目标信息;参数对象、内部指针和结果对象保留原生内存布局,由目标节点上的 worker 通过共享地址空间直接访问。运行时还可在不改变对象虚拟地址的前提下,在 CXL 共享 内存和本地 DRAM 之间调整页面驻留位置。
本项目重点解决以下问题:
create
execute
join
cleanup
xDSM 保存并在目标节点原地址恢复必要的进程映像,使函数入口、全局符号和运行环境 具有一致的虚拟地址语义。需要跨节点读写的动态对象位于 xDSM 管理的共享对象区, 由固定地址映射和 mapping record 维护。
全地址空间共享不表示所有普通 VMA 都自动成为跨节点可写共享映射。进程映像恢复 负责让代码和运行环境能够被目标节点解释;xDSM 共享对象区负责承载需要跨节点读写 的业务对象。
应用和远端 worker 始终使用相同虚拟地址访问对象。运行时根据页面访问状态在以下 路径间调整物理驻留位置:
页面放置只改变页面的物理位置和 PTE 指向,不改变 VMA、对象虚拟地址或内部指针。
src/dt.c
include/dt.h
src/mm.c
include/mm.h
src/dt_io.c
src/io.c
src/cr.c
src/ckpt.c
/dev/ckpt
src/shim.c
wrap/
pthread
src/mx-sc/
src/mx-rc-wt/
src/mx-rc-wb/
ckpt_mm/
config/config.h
include/common.h
bench/
test/
scripts/
项目不需要单独启动常驻 RPC 服务端。应用加载 xDSM 运行库后,src/shim.c 会完成 运行时初始化和服务进程派生。
CONFIG_CKPT_MM=y
ckpt_mm
当前实验不是实际的 CXL 3.0 多主机部署。迁移到其他服务器时,需要根据机器的 CPU、NUMA 和共享内存拓扑修改编译期配置。
Ubuntu 环境可安装以下基础依赖:
sudo apt update sudo apt install build-essential cmake libnuma-dev numactl
完整运行需要 root 权限,用于创建共享内存后端、调整系统参数、清理页缓存以及访问 内核和性能采样接口。
以下步骤适用于已经启动定制内核、创建好共享内存文件并完成拓扑配置的服务器。
uname -r grep CONFIG_CKPT_MM /boot/config-"$(uname -r)" test -c /dev/ckpt && echo "ckpt device: ready" numactl --hardware ls -lh /mnt/raminterleave4_5/dax cat /proc/sys/kernel/randomize_va_space cat /proc/sys/kernel/numa_balancing cat /proc/sys/vm/max_map_count
预期条件如下:
sudo
/mnt/raminterleave4_5/dax
CXL_MEM_SIZE
kernel.randomize_va_space=0
kernel.numa_balancing=0
vm.max_map_count
2097152
PageRank 不依赖外部数据集,适合用于检查完整运行链路:
cd bench/10-pagerank make run-dt-mx-sc-f-debug GRAPH_SIZE=1000 NTHREADS=8
该目标会自动完成以下工作:
libdthreads-mx-sc.so
LD_PRELOAD
程序正常完成时会输出:
graph: nodes iter 1: GB/s, dt= us ... Iterations: 200 Compute time: seconds End-to-end time: seconds
上述小规模运行用于功能检查,不代表正式性能结果。
仓库当前 PageRank Makefile 的默认参数为 44,000 个图节点和 32 个线程,矩阵工作集 约为 15.5 GB:
cd bench/10-pagerank make run-dt-mx-sc-f-debug
该命令运行时间较长、输出较多,并要求共享后端和本地内存容量满足配置。首次验证 建议先使用前述 GRAPH_SIZE=1000 NTHREADS=8。
GRAPH_SIZE=1000 NTHREADS=8
xDSM 的地址空间恢复和页面移动依赖 ckpt_mm。当前验证方式是将其以 CONFIG_CKPT_MM=y 编入定制 Linux 内核,而不是在运行时加载独立模块。
在已经集成 ckpt_mm 的内核源码目录中执行:
make -j"$(nproc)" sudo make modules_install sudo make install sudo update-grub sudo reboot
重启时从 GRUB 选择新内核,然后检查:
uname -r grep CONFIG_CKPT_MM /boot/config-"$(uname -r)" test -c /dev/ckpt && echo "ckpt device: ready"
仅编译本仓库的用户态代码不会创建 /dev/ckpt。内核源码的获取方式以及 ckpt_mm 与 Linux Kconfig/Makefile 的集成方法,应以比赛提交的定制内核仓库说明 为准。
先查看目标机器拓扑:
lscpu -e=CPU,NODE numactl --hardware
然后核对并按实际机器修改:
MM_FILE_PATH
仓库当前配置使用四个逻辑计算节点,并将共享文件设置为:
该路径对应实验服务器上的 CXL memory-only NUMA 节点 4、5,不能直接套用到其他 机器。
当前实验通过 tmpfs 在 CXL memory-only NUMA 节点上创建 64 GB 共享文件:
sudo ./scripts/numa/numa_memfile.sh create \ -p interleave -n 4-5 -s 64G -f dax ls -lh /mnt/raminterleave4_5/dax
该脚本会挂载 tmpfs、创建文件并预触碰页面,因此执行可能持续一段时间。节点编号、 容量和路径必须与目标机器拓扑及 include/common.h 保持一致。
仓库中的 scripts/dax/ 提供 DAX 后端配置参考,但本项目当前结果使用的是上述 CXL memory-only NUMA + tmpfs 配置。
scripts/dax/
echo 2097152 | sudo tee /proc/sys/vm/max_map_count sudo sysctl -w kernel.randomize_va_space=0 echo 0 | sudo tee /proc/sys/kernel/numa_balancing
这些设置分别用于:
以上命令修改当前运行系统的内核参数。默认情况下重启后失效,不建议在未理解影响 时写入永久系统配置。
在项目根目录执行:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release cmake --build build \ --target wrap dthreads-wise dthreads-xx-sc \ dthreads-mx-sc dthreads-mx-rc-wt \ -- -j"$(nproc)"
生成的共享库位于 build/lib/。
build/lib/
dthreads-wise
libdthreads-wise.so
run-dt-cxl-only
dthreads-xx-sc
libdthreads-xx-sc.so
run-dt-sc
dthreads-mx-sc
run-dt-mx-sc-f
dthreads-mx-rc-wt
libdthreads-mx-rc-wt.so
run-dt-mx-rc-f
各 benchmark 的 run-dt-* 目标会按指定配置重新构建运行库,因此也可以直接从 benchmark 目录启动。
run-dt-*
在相同图规模和线程数下检查四种配置:
cd bench/10-pagerank make run-dt-cxl-only GRAPH_SIZE=1000 NTHREADS=8 make run-dt-sc GRAPH_SIZE=1000 NTHREADS=8 make run-dt-mx-sc-f GRAPH_SIZE=1000 NTHREADS=8 make run-dt-mx-rc-f GRAPH_SIZE=1000 NTHREADS=8
公共 Makefile 会在每次运行前写入 /proc/sys/vm/drop_caches,因此这些目标需要 sudo 权限。小规模结果只用于检查各运行目标是否正常,正式比较应使用相同环境、 数据规模、线程数和重复运行方法。
/proc/sys/vm/drop_caches
bench/07-streamcluster
bench/13-jacobi
bench/15-blackscholes
bench/24-loopnest
bench/27-bfs
bench/32-kv
bench/33-graph500
bench/38-MOE
这些目录通过 bench/Makefile.common 共享 xDSM 构建与运行规则。部分大型应用需要 额外数据集、模型权重或第三方源码,具体要求以各子目录的 README 为准。
bench/Makefile.common
检查当前内核是否包含:
grep CONFIG_CKPT_MM /boot/config-"$(uname -r)"
仅构建用户态运行库不能创建该设备。需要启动集成 ckpt_mm 的定制内核。
检查:
ls -lh /mnt/raminterleave4_5/dax grep -nE "MM_FILE_PATH|CXL_MEM_SIZE" include/common.h
共享文件路径和容量必须与编译期配置一致。
检查 ASLR 和 VMA 限制:
cat /proc/sys/kernel/randomize_va_space cat /proc/sys/vm/max_map_count
当前原型依赖跨进程固定地址语义,地址布局冲突会导致初始化失败。
当前 config/config.h 保存的是实验服务器的拓扑。使用以下命令查看目标机器并重新 配置:
动态页面放置依赖相应的硬件性能采样能力、内核性能事件支持和访问权限。程序能够 编译运行,不表示目标机器已经具备与实验服务器相同的采样条件。
项目的部分基础数据结构和内存分配实现参考或使用了以下开源项目:
第三方代码、benchmark 和对照实现不应计入 xDSM 核心原创代码规模。具体许可证及 来源说明以最终提交仓库中的 LICENSE 和第三方声明文件为准。
LICENSE
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
xDSM
xDSM 是一套面向跨节点共享内存环境的高性能远程调用运行时。项目以
pthread_create()/pthread_join()兼容接口为应用入口,将一次远程调用组织为:xDSM 将轻量控制路径与业务数据路径分离。控制消息只携带函数入口、参数地址和必要 的目标信息;参数对象、内部指针和结果对象保留原生内存布局,由目标节点上的 worker 通过共享地址空间直接访问。运行时还可在不改变对象虚拟地址的前提下,在 CXL 共享 内存和本地 DRAM 之间调整页面驻留位置。
本项目重点解决以下问题:
create、execute、join、cleanup完整线程生命周期;核心设计
全地址空间共享执行环境
xDSM 保存并在目标节点原地址恢复必要的进程映像,使函数入口、全局符号和运行环境 具有一致的虚拟地址语义。需要跨节点读写的动态对象位于 xDSM 管理的共享对象区, 由固定地址映射和 mapping record 维护。
全地址空间共享不表示所有普通 VMA 都自动成为跨节点可写共享映射。进程映像恢复 负责让代码和运行环境能够被目标节点解释;xDSM 共享对象区负责承载需要跨节点读写 的业务对象。
动态页面放置
应用和远端 worker 始终使用相同虚拟地址访问对象。运行时根据页面访问状态在以下 路径间调整物理驻留位置:
页面放置只改变页面的物理位置和 PTE 指向,不改变 VMA、对象虚拟地址或内部指针。
代码结构
src/dt.c、include/dt.hsrc/mm.c、include/mm.hsrc/dt_io.c、src/io.csrc/cr.c、src/ckpt.c/dev/ckpt用户态封装src/shim.c、wrap/pthread与内存接口接管、运行时自动初始化src/mx-sc/src/mx-rc-wt/、src/mx-rc-wb/ckpt_mm/config/config.hinclude/common.hbench/test/scripts/项目不需要单独启动常驻 RPC 服务端。应用加载 xDSM 运行库后,
src/shim.c会完成 运行时初始化和服务进程派生。运行环境
已验证环境
CONFIG_CKPT_MM=y,ckpt_mm直接编入内核;/dev/ckpt字符设备;当前实验不是实际的 CXL 3.0 多主机部署。迁移到其他服务器时,需要根据机器的 CPU、NUMA 和共享内存拓扑修改编译期配置。
软件依赖
Ubuntu 环境可安装以下基础依赖:
完整运行需要 root 权限,用于创建共享内存后端、调整系统参数、清理页缓存以及访问 内核和性能采样接口。
快速运行
以下步骤适用于已经启动定制内核、创建好共享内存文件并完成拓扑配置的服务器。
1. 检查环境
预期条件如下:
CONFIG_CKPT_MM=y;/dev/ckpt存在且当前用户可通过sudo访问;/mnt/raminterleave4_5/dax存在,容量与CXL_MEM_SIZE一致;kernel.randomize_va_space=0;kernel.numa_balancing=0;vm.max_map_count不小于2097152。2. 运行小规模 PageRank
PageRank 不依赖外部数据集,适合用于检查完整运行链路:
该目标会自动完成以下工作:
libdthreads-mx-sc.so;LD_PRELOAD加载 xDSM-SC 运行时;程序正常完成时会输出:
上述小规模运行用于功能检查,不代表正式性能结果。
3. 运行演示规模 PageRank
仓库当前 PageRank Makefile 的默认参数为 44,000 个图节点和 32 个线程,矩阵工作集 约为 15.5 GB:
该命令运行时间较长、输出较多,并要求共享后端和本地内存容量满足配置。首次验证 建议先使用前述
GRAPH_SIZE=1000 NTHREADS=8。完整环境准备
1. 定制内核与
/dev/ckptxDSM 的地址空间恢复和页面移动依赖
ckpt_mm。当前验证方式是将其以CONFIG_CKPT_MM=y编入定制 Linux 内核,而不是在运行时加载独立模块。在已经集成
ckpt_mm的内核源码目录中执行:重启时从 GRUB 选择新内核,然后检查:
仅编译本仓库的用户态代码不会创建
/dev/ckpt。内核源码的获取方式以及ckpt_mm与 Linux Kconfig/Makefile 的集成方法,应以比赛提交的定制内核仓库说明 为准。2. 调整节点和共享内存配置
先查看目标机器拓扑:
然后核对并按实际机器修改:
config/config.h中的逻辑节点数量、CPU 亲和性和 NUMA 节点映射;include/common.h中的CXL_MEM_SIZE;include/common.h中的MM_FILE_PATH。仓库当前配置使用四个逻辑计算节点,并将共享文件设置为:
该路径对应实验服务器上的 CXL memory-only NUMA 节点 4、5,不能直接套用到其他 机器。
3. 创建共享内存后端
当前实验通过 tmpfs 在 CXL memory-only NUMA 节点上创建 64 GB 共享文件:
该脚本会挂载 tmpfs、创建文件并预触碰页面,因此执行可能持续一段时间。节点编号、 容量和路径必须与目标机器拓扑及
include/common.h保持一致。仓库中的
scripts/dax/提供 DAX 后端配置参考,但本项目当前结果使用的是上述 CXL memory-only NUMA + tmpfs 配置。4. 设置系统参数
这些设置分别用于:
以上命令修改当前运行系统的内核参数。默认情况下重启后失效,不建议在未理解影响 时写入永久系统配置。
5. 编译运行时
在项目根目录执行:
生成的共享库位于
build/lib/。dthreads-wiselibdthreads-wise.sorun-dt-cxl-onlydthreads-xx-sclibdthreads-xx-sc.sorun-dt-scdthreads-mx-sclibdthreads-mx-sc.sorun-dt-mx-sc-fdthreads-mx-rc-wtlibdthreads-mx-rc-wt.sorun-dt-mx-rc-f各 benchmark 的
run-dt-*目标会按指定配置重新构建运行库,因此也可以直接从 benchmark 目录启动。运行不同配置
在相同图规模和线程数下检查四种配置:
公共 Makefile 会在每次运行前写入
/proc/sys/vm/drop_caches,因此这些目标需要sudo权限。小规模结果只用于检查各运行目标是否正常,正式比较应使用相同环境、 数据规模、线程数和重复运行方法。其他应用
bench/07-streamclusterbench/13-jacobibench/15-blackscholesbench/24-loopnestbench/27-bfsbench/32-kvbench/33-graph500bench/38-MOE这些目录通过
bench/Makefile.common共享 xDSM 构建与运行规则。部分大型应用需要 额外数据集、模型权重或第三方源码,具体要求以各子目录的 README 为准。常见问题
/dev/ckpt不存在检查当前内核是否包含:
仅构建用户态运行库不能创建该设备。需要启动集成
ckpt_mm的定制内核。无法打开共享文件
检查:
共享文件路径和容量必须与编译期配置一致。
启动时出现固定地址映射失败
检查 ASLR 和 VMA 限制:
当前原型依赖跨进程固定地址语义,地址布局冲突会导致初始化失败。
CPU 绑定或 NUMA 节点不存在
当前
config/config.h保存的是实验服务器的拓扑。使用以下命令查看目标机器并重新 配置:动态页面放置日志或效果异常
动态页面放置依赖相应的硬件性能采样能力、内核性能事件支持和访问权限。程序能够 编译运行,不表示目标机器已经具备与实验服务器相同的采样条件。
当前边界
pthread接口是兼容子集,不支持全部 POSIX pthread 语义;pthread_join()用于完成同步,不负责复制复杂业务返回值;第三方代码与致谢
项目的部分基础数据结构和内存分配实现参考或使用了以下开源项目:
第三方代码、benchmark 和对照实现不应计入 xDSM 核心原创代码规模。具体许可证及 来源说明以最终提交仓库中的
LICENSE和第三方声明文件为准。