`std::execution`, the standard C++ framework for asynchronous and parallel programming.
翻訳待ち
開発ツールC++ · CudaGitHub @NVIDIA自分でインストール所有者未確認
Paste into Claude or ChatGPT for installation instructions suited to your environment.
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A reference implementation of std::execution ([exec]), the C++26 model for asynchronous and parallel programming.
stdexec lets you express asynchronous work as composable, lazy sender pipelines that can run on threads, thread pools, GPUs, or any custom execution context — with structured concurrency guarantees.
[!WARNING]
stdexecis experimental and tracks an evolving standard. APIs may change without notice. NVIDIA does not guarantee fitness for any particular purpose.
Run three pieces of work concurrently on the system thread pool. Try it live on godbolt.
#include <stdexec/execution.hpp>
#include <cstdio>
namespace ex = stdexec;
int main() {
auto sched = ex::get_parallel_scheduler();
auto fun = [](int i) { return i * i; };
// Build a lazy pipeline: three squares, computed in parallel.
auto work = ex::when_all(ex::on(sched, ex::just(0) | ex::then(fun)),
ex::on(sched, ex::just(1) | ex::then(fun)),
ex::on(sched, ex::just(2) | ex::then(fun)));
// Launch the work and wait for the result.
auto [i, j, k] = ex::sync_wait(std::move(work)).value();
std::printf("%d %d %d\n", i, j, k); // prints "0 1 4"
}
get_parallel_scheduler() needs its backend compiled in, so either define STDEXEC_PARALLEL_SCHEDULER_HEADER_ONLY for your target (as the godbolt link does), or configure stdexec with -DSTDEXEC_BUILD_PARALLEL_SCHEDULER=ON and link STDEXEC::parallel_scheduler. Without either, the program can still link and then crash on that call.
std::execution (P2300).then, let_value, when_all, bulk, split, transfer, upon_*, ...async_scope, task, finally, when_any, repeat_n, ...io_uring context, NVIDIA GPU contexts, your own.nvexec schedulers (nvc++ compiler).<exec/...>) for primitives not (yet) in the standard.| Compiler | Minimum version | Notes |
|---|---|---|
| GCC | 12 | |
| Clang | 16 | |
| MSVC | 14.43 | |
| Xcode (Apple Clang) | 16 | |
| nvc++ | 26.5 | required for GPU support |
Requires -std=c++20 or later.
[!NOTE]
stdexecdoes not yet support NVIDIA'snvcccompiler.
Pick whichever fits your project.
CPM fetches and configures stdexec automatically from your CMakeLists.txt:
CPMAddPackage(
NAME stdexec
GITHUB_REPOSITORY NVIDIA/stdexec
GIT_TAG main # or a specific tag
)
target_link_libraries(my_target PRIVATE STDEXEC::stdexec)
add_subdirectoryClone alongside your project and add it as a subdirectory:
git clone https://github.com/NVIDIA/stdexec.git
add_subdirectory(stdexec)
target_link_libraries(my_target PRIVATE STDEXEC::stdexec)
A conanfile.py is provided for use with the Conan package manager.
Starting with NVHPC SDK 22.11, stdexec is bundled with nvc++. Pass --experimental-stdpar to put stdexec headers on the include path. Add -stdpar=gpu for GPU features. See the godbolt example.
stdexec is header-only, so adding -I<stdexec root>/include to your compile command is sufficient. Using the CMake target is recommended because it sets the required compile flags.
A minimal CMakeLists.txt using CPM:
cmake_minimum_required(VERSION 3.25.0)
project(stdexec_example LANGUAGES CXX)
include(CPM.cmake) # see https://github.com/cpm-cmake/CPM.cmake#adding-cpm
CPMAddPackage(
NAME stdexec
GITHUB_REPOSITORY NVIDIA/stdexec
GIT_TAG main
)
add_executable(example example.cpp)
target_link_libraries(example PRIVATE STDEXEC::stdexec)
stdexec ships GPU schedulers in <nvexec/...> for use with nvc++ -stdpar=gpu:
| Scheduler | Header | Description |
|---|---|---|
nvexec::stream_scheduler | <nvexec/stream_context.cuh> | Single-GPU scheduler (device 0). |
nvexec::multi_gpu_stream_scheduler | <nvexec/multi_gpu_context.cuh> | Multi-GPU scheduler across all visible devices. |
This is the beginning of the README. Read the rest at the original. Read the full README ↗