Language: CPP
Concurrency/Parallelism
HPX was developed as part of the ParalleX execution model, a research initiative to overcome the limitations of traditional parallel programming approaches. It is designed as a modern C++ runtime that unifies local and distributed computing under a single asynchronous API. HPX has gained adoption in scientific computing, high-performance computing (HPC), and research environments due to its ability to scale efficiently on thousands of nodes.
HPX (High Performance ParalleX) is a C++ runtime system for parallel and distributed applications. It provides a standards-conforming API for asynchronous task-based programming, scalability across many cores, and distributed computing with an emphasis on performance portability.
sudo apt install libhpx-devbrew install hpxvcpkg install hpxHPX offers C++ standard-like parallel algorithms (`for_each`, `reduce`, etc.), futures, channels, distributed objects, and executors. It integrates deeply with modern C++ (C++11 and beyond) and emphasizes asynchronous execution using futures and continuations.
#include <hpx/hpx_main.hpp>
#include <hpx/include/iostreams.hpp>
int main() {
hpx::cout << "Hello, HPX!" << hpx::endl;
return 0;
}A minimal HPX program that runs with the HPX runtime system initialized.
#include <hpx/hpx_main.hpp>
#include <hpx/include/parallel_for_each.hpp>
#include <vector>
#include <iostream>
int main() {
std::vector<int> data = {1, 2, 3, 4, 5};
hpx::for_each(hpx::execution::par, data.begin(), data.end(), [](int& n) {
n *= 2;
});
for (int n : data) std::cout << n << " ";
return 0;
}Doubles all elements in a vector in parallel using HPX's parallel algorithm.
#include <hpx/hpx_main.hpp>
#include <hpx/include/lcos.hpp>
#include <iostream>
int main() {
auto f = hpx::async([]() { return 42; });
std::cout << "The answer is " << f.get() << std::endl;
}Uses `hpx::async` to launch an asynchronous task returning a future.
auto f = hpx::async([] { return 10; });
auto g = f.then([](hpx::future<int> f) {
return f.get() * 2;
});
std::cout << g.get() << std::endl;Chains tasks together with continuations using `then()`.
#include <hpx/include/components.hpp>
// Example: distributed object can be registered and called across nodes.HPX allows distributing work across multiple compute nodes transparently.
#include <hpx/include/lcos.hpp>
hpx::lcos::channel<int> ch;
ch.set(5);
int val = ch.get();Implements message passing between tasks with channels.
Use HPX’s standard-conforming algorithms (`hpx::for_each`, `hpx::reduce`) for seamless parallelism.
Prefer asynchronous APIs with futures to maximize overlap of computation and communication.
Leverage continuations (`then`) to chain dependent tasks efficiently.
Use distributed objects when scaling across multiple nodes in a cluster.
Integrate HPX with existing C++17/20 parallel STL for portability.