HPX 是基于现代 C++ 的并行分布式运行时系统,支持任务/数据并行、异步编程与分布式执行;需用 hpx::init 启动、hpx::future 组合并发逻辑,依赖 C++17+、CMake 构建,核心机制包括 hpx::async、hpx::dataflow 和 AGAS 分布式寻址。

HPX 是一个现代 C++ 编写的并行与分布式运行时系统,专为高性能计算(HPC)设计,支持任务并行、数据并行、异步编程和分布式执行。它不是简单的线程库,而是一个轻量级、可扩展的“C++ 标准化未来”的实现基础(如 std::async, std::future, std::execution 的超集)。使用 HPX 不是“调用几个函数就并行了”,而是要理解其运行时模型和编程范式。
安装与基础编译配置
HPX 依赖较新 C++ 标准(推荐 C++17 或以上)、Boost(部分组件)、hwloc、jemalloc(可选),建议用 CMake 构建:
- Linux/macOS 下推荐从源码构建(官方不提供稳定二进制包):
git clone https://github.com/STEllAR-GROUP/hpx.git && cd hpx && mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DHPX_WITH_MALLOC=jemalloc -DHPX_WITH_THREAD_LOCAL_STORAGE=ON ..
make -j$(nproc) - 安装后设置
HPX_DIR环境变量或在 CMakeLists.txt 中用find_package(HPX REQUIRED) - 简单可执行程序需链接
hpx_main和hpx,且入口函数必须是hpx::init启动的main变体(非传统int main())
写第一个 HPX 并行任务(hpx::async)
HPX 的核心抽象是“轻量级线程”(即 HPX threads),由运行时调度,可跨 OS 线程迁移。最常用启动方式是 hpx::async:
- 替换
std::async:它返回hpx::future,语义兼容但底层更高效、支持远程执行 - 示例:并行计算向量平方和
hpx::future
std::vector
return std::accumulate(v.begin(), v.end(), 0.0,
[](double s, double x) { return s + x * x; });
});
double result = f.get(); // 阻塞等待
用 hpx::dataflow 实现任务图依赖
当多个异步操作有数据依赖(如 A→B→C),hpx::dataflow 自动构造执行图,避免手动 wait:
立即学习“C++免费学习笔记(深入)”;
- 接受一个可调用对象 + 若干
future参数,仅当所有 future 就绪才触发 - 返回新的
future,支持链式组合 - 示例:先算 a² 和 b²,再求和
auto fa = hpx::async([]{ return 3.0; });
auto fb = hpx::async([]{ return 4.0; });
auto fsq_a = hpx::dataflow(hpx::launch::async, [](double x){ return x*x; }, fa);
auto fsq_b = hpx::dataflow(hpx::launch::async, [](double x){ return x*x; }, fb);
auto sum = hpx::dataflow(hpx::launch::async,
[](double a, double b) { return a + b; }, fsq_a, fsq_b);
assert(sum.get() == 25.0);
分布式运行:本地+远程协同
HPX 天然支持分布式——只需启动多个实例并用 --hpx:connect 或 --hpx:agas 连接 AGAS(地址空间服务):
- 单机多进程模拟:启动两个节点:
./app --hpx:localities=2
或分别运行:
./app --hpx:node=0 --hpx:agas=12345 &
./app --hpx:node=1 --hpx:connect=12345 - 远程调用靠
hpx::async+hpx::naming::id_type(全局可寻址 ID),对象需继承hpx::components::component_base - 实际项目中常配合
hpx::lcos::local::channel或hpx::collectives做通信协调
基本上就这些。HPX 的学习曲线比 OpenMP 或 std::thread 略陡,但它把并行抽象得更统一、更可移植,尤其适合需要细粒度任务调度、混合本地/远程、或构建高可扩展 HPC 应用的场景。不复杂但容易忽略的是:必须用 hpx::init 启动,不能直接写 int main();所有并发逻辑应基于 hpx::future 组合,而非裸线程管理。










