0

0

c++如何使用HPX并行计算框架_c++分布式与并行运行时【HPC】

穿越時空

穿越時空

发布时间:2026-01-06 18:15:00

|

335人浏览过

|

来源于php中文网

原创

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

c++如何使用hpx并行计算框架_c++分布式与并行运行时【hpc】

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_mainhpx,且入口函数必须是 hpx::init 启动的 main 变体(非传统 int main()

写第一个 HPX 并行任务(hpx::async)

HPX 的核心抽象是“轻量级线程”(即 HPX threads),由运行时调度,可跨 OS 线程迁移。最常用启动方式是 hpx::async

  • 替换 std::async:它返回 hpx::future,语义兼容但底层更高效、支持远程执行
  • 示例:并行计算向量平方和

hpx::future f = hpx::async([]{
  std::vector v(1000000, 2.0);
  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:

GentleAI
GentleAI

GentleAI是一个高效的AI工作平台,为普通人提供智能计算、简单易用的界面和专业技术支持。让人工智能服务每一个人。

下载

立即学习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::channelhpx::collectives 做通信协调

基本上就这些。HPX 的学习曲线比 OpenMP 或 std::thread 略陡,但它把并行抽象得更统一、更可移植,尤其适合需要细粒度任务调度、混合本地/远程、或构建高可扩展 HPC 应用的场景。不复杂但容易忽略的是:必须用 hpx::init 启动,不能直接写 int main();所有并发逻辑应基于 hpx::future 组合,而非裸线程管理。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

321

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

231

2023.10.07

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

314

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

528

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

193

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

97

2025.10.23

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.2万人学习

C 教程
C 教程

共75课时 | 3.9万人学习

C++教程
C++教程

共115课时 | 11.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号