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 构建:
HPX_DIR 环境变量或在 CMakeLists.txt 中用 find_package(HPX REQUIRED)
hpx_main 和 hpx,且入口函数必须是 hpx::init 启动的 main 变体(非传统 int main())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(); // 阻塞等待
当多个异步操作有数据依赖(如 A→B→C),hpx::dataflow 自动构造执行图,避免手动 wait:
future 参数,仅当所有 future 就绪才触发future,支持链式组合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(地址空间服务):
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 组合,而非裸线程管理。