文本更改
面向异构内存与多路径传输的 C++ RPC 运行时
HMC-RPC 构建在团队自主研发的 HMC(Heterogeneous Memory Communication) 通信底座之上,为远程调用提供稳定线协议、方法分发、强类型编解码、请求生命周期 以及 TCP、UDS 和 UCX 大消息数据面。HMC 统一抽象 CPU、GPU 与其他加速器内存, 使 RPC 语义不必绑定单一设备或传输实现。
快速开始 · 架构 · 支持状态 · 性能与验证 · 文档 · Roadmap
HMC(Heterogeneous Memory Communication)是团队自主研发的一个面向异构系统 (CPU、GPU 和各类加速器)的通信框架。它提供:
Memory
ConnBuffer
Communicator
ConnType.RDMA
ConnType.UCX
稳定的 RPC 语义:48 字节固定大端序头部,请求编号、方法编号、状态码和 负载模式均显式编码,不依赖主机 ABI。
控制面与数据面分离:TCP 承载控制帧和通用回退路径,大负载可通过 HMC/UCX TAG 传输。
异构内存抽象:Memory、ConnBuffer 和 Communicator 隔离设备内存、 注册缓冲区与具体传输路径。
可控并发与生命周期:持久连接、固定工作线程池、单连接多在途请求、 乱序响应匹配、deadline、cancel 和优雅关闭。
可复现验证:提供单元测试、双进程集成测试、双机验证记录和 benchmark 矩阵脚本。
HMC 支持 CPU 内存以及多种加速器后端,包括:
/usr/local/ucx
没有检测到 GPU 工具链时,项目会构建 CPU-only 版本。UCX 安装在其他位置时, 通过 UCX_ROOT 指定前缀,并确保运行时能够找到其共享库。
UCX_ROOT
cmake -S . -B build-rpc \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_TESTS=ON \ -DUCX_ROOT=/usr/local/ucx cmake --build build-rpc -j"$(nproc)" ctest --test-dir build-rpc --output-on-failure
当前 CTest 包含统一单元测试、真实 TCP 双进程测试和 benchmark 烟雾测试。
终端 A 启动服务端:
./build-rpc/apps/rpc_tcp/hmc_rpc_tcp_server \ --bind-address 127.0.0.1 \ --port 18080 \ --workers 4 \ --max-connections 68 \ --max-inflight 64
终端 B 调用 uppercase:
uppercase
./build-rpc/apps/rpc_tcp/hmc_rpc_tcp_client \ --server-address 127.0.0.1 \ --port 18080 \ --method uppercase \ --message "hello hmc rpc" \ --repeat 3
预期输出:
response[3]=HELLO HMC RPC Completed 3 uppercase RPC call(s)
服务端内置三个演示方法:
echo
complex
复合类型示例:
./build-rpc/apps/rpc_tcp/hmc_rpc_tcp_client \ --server-address 127.0.0.1 \ --port 18080 \ --method complex \ --message "typed payload" \ --values "3,5,8"
序列化层逐字段编码字符串、动态数组和复合结构,不直接复制 C++ 对象内存,从而 避免 padding、ABI 和主机端序差异。
HMC-RPC 将应用接口、调用生命周期、线协议和数据传输分层:
RpcCodec<T>
method id
request id
INLINE
TCP_STREAM
HMC_BUFFER
默认 UCX 阈值为 64 KiB。数据面在控制帧发出前准备失败时可以回退到 TCP; 控制帧发出后的 UCX 失败不会自动重放,因为服务端可能已经执行过对应方法。
CPU UCX/TCP 双机基线的完整启动和 benchmark 命令见 大消息数据面文档。
HostMemory
CudaMemory
RocmMemory
NeuwareMemory
MusaMemory
“已实现”表示仓库中存在对应代码或测试路径,不等同于完成了特定硬件上的跨机 正确性与性能验证。
以下结果用于说明当前版本的可复现基线,而不是硬件峰值。TCP 数据来自两台 Linux 节点、Release 构建、8 个服务端工作线程;每组执行 5 轮并取中位数。详细环境、 方法和完整矩阵见 TCP 性能基线。
单连接流水矩阵共完成 60 轮、1,200,000 次计时调用,每次均校验响应内容。 完整结果见 TCP 多在途请求。
CPU UCX 大消息测试固定 UCX_TLS=tcp,在预建长连接上完成 1 MiB echo RPC:
UCX_TLS=tcp
该结果验证 CPU UCX/TCP 的正确性和持续传输,不代表原生 RDMA 或 GDR 性能。
call()
UCX 重连问题的证据和后续状态机约束见 可靠性调查。
include/hmc/ RPC、协议、序列化与传输公开接口 src/rpc/ 协议、运行时、TCP/UDS 和数据面实现 src/network/ UCX、RDMA、P2P 与连接管理 src/memories/ CPU 与加速器内存后端 apps/rpc_tcp/ 服务端、客户端和 benchmark tests/ 单元、集成与双进程测试 scripts/ 可复现 benchmark 脚本 docs/ 设计、验证记录与性能报告
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
HMC-RPC
面向异构内存与多路径传输的 C++ RPC 运行时
HMC-RPC 构建在团队自主研发的 HMC(Heterogeneous Memory Communication) 通信底座之上,为远程调用提供稳定线协议、方法分发、强类型编解码、请求生命周期 以及 TCP、UDS 和 UCX 大消息数据面。HMC 统一抽象 CPU、GPU 与其他加速器内存, 使 RPC 语义不必绑定单一设备或传输实现。
快速开始 · 架构 · 支持状态 · 性能与验证 · 文档 · Roadmap
HMC 异构通信底座
HMC(Heterogeneous Memory Communication)是团队自主研发的一个面向异构系统 (CPU、GPU 和各类加速器)的通信框架。它提供:
Memory一个与设备无关的接口,用于申请、释放缓冲区,并在不同设备之间复制数据。ConnBuffer一个稳定、已注册的缓冲区,作为所有网络传输的数据暂存区(staging area)。Communicator以同一套接口实现对端缓冲区之间的单边数据读写:ConnType.RDMA:依赖平台和设备能力。ConnType.UCX:常用于 CPU,以及部分 GPU-direct 配置。为什么选择 HMC-RPC
稳定的 RPC 语义:48 字节固定大端序头部,请求编号、方法编号、状态码和 负载模式均显式编码,不依赖主机 ABI。
控制面与数据面分离:TCP 承载控制帧和通用回退路径,大负载可通过 HMC/UCX TAG 传输。
异构内存抽象:
Memory、ConnBuffer和Communicator隔离设备内存、 注册缓冲区与具体传输路径。可控并发与生命周期:持久连接、固定工作线程池、单连接多在途请求、 乱序响应匹配、deadline、cancel 和优雅关闭。
可复现验证:提供单元测试、双进程集成测试、双机验证记录和 benchmark 矩阵脚本。
HMC 支持 CPU 内存以及多种加速器后端,包括:
快速开始
环境要求
/usr/local/ucx没有检测到 GPU 工具链时,项目会构建 CPU-only 版本。UCX 安装在其他位置时, 通过
UCX_ROOT指定前缀,并确保运行时能够找到其共享库。构建与测试
当前 CTest 包含统一单元测试、真实 TCP 双进程测试和 benchmark 烟雾测试。
运行第一个 RPC
终端 A 启动服务端:
终端 B 调用
uppercase:预期输出:
服务端内置三个演示方法:
echouppercasecomplex复合类型示例:
序列化层逐字段编码字符串、动态数组和复合结构,不直接复制 C++ 对象内存,从而 避免 padding、ABI 和主机端序差异。
架构
HMC-RPC 将应用接口、调用生命周期、线协议和数据传输分层:
RpcCodec<T>负责确定性大端序编解码。method id分发请求,运行时管理状态、截止时间与取消。request id匹配响应,并描述负载所在的数据路径。大消息路径
INLINETCP_STREAMHMC_BUFFER默认 UCX 阈值为 64 KiB。数据面在控制帧发出前准备失败时可以回退到 TCP; 控制帧发出后的 UCX 失败不会自动重放,因为服务端可能已经执行过对应方法。
CPU UCX/TCP 双机基线的完整启动和 benchmark 命令见 大消息数据面文档。
支持状态
RPC 与传输能力
异构设备基础
HostMemory、CPUConnBufferCudaMemory、构建探测、device stagingRocmMemory、ROCm IPC/P2PNeuwareMemory、构建探测、同机 P2PMusaMemory、构建探测“已实现”表示仓库中存在对应代码或测试路径,不等同于完成了特定硬件上的跨机 正确性与性能验证。
性能与验证
以下结果用于说明当前版本的可复现基线,而不是硬件峰值。TCP 数据来自两台 Linux 节点、Release 构建、8 个服务端工作线程;每组执行 5 轮并取中位数。详细环境、 方法和完整矩阵见 TCP 性能基线。
单连接流水矩阵共完成 60 轮、1,200,000 次计时调用,每次均校验响应内容。 完整结果见 TCP 多在途请求。
CPU UCX 大消息测试固定
UCX_TLS=tcp,在预建长连接上完成 1 MiB echo RPC:该结果验证 CPU UCX/TCP 的正确性和持续传输,不代表原生 RDMA 或 GDR 性能。
已知限制
call();多在途请求由多个调用线程与请求编号协作完成。UCX 重连问题的证据和后续状态机约束见 可靠性调查。
文档
项目结构