`std::execution`, the standard C++ framework for asynchronous and parallel programming.
翻譯準備中
開發工具C++ · CudaGitHub @NVIDIA自行安裝營運者未確認
試用過了嗎? 點一下就好,不需要登入。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
安裝型專案無需部署網域也可驗證。個人儲存庫可透過 GitHub 登入驗證,組織儲存庫可使用上方的儲存庫驗證檔案。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 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. |
Live example: https://godbolt.org/z/h7rh5qGhj
The examples/ directory contains runnable programs demonstrating the library.
| Example | What it shows |
|---|---|
hello_world.cpp | The "hello world" of senders. |
hello_coro.cpp | Awaiting a sender from a coroutine. |
then.cpp | Writing a then algorithm from scratch. |
retry.cpp | Writing a retry algorithm from scratch. |
scope.cpp | Structured concurrency with async_scope. |
io_uring.cpp | Async I/O via the Linux io_uring context. |
sudoku.cpp | A parallel sudoku solver. |
server_theme/ | Server-style patterns (let_value, split, bulk, transfer). |
nvexec/ | GPU schedulers, including the Maxwell solver. |
📖 Full documentation: https://nvidia.github.io/stdexec
docs/CONTRIBUTING-docs.md[exec] — std::executionThe library is organized into three namespaces:
| Namespace | Headers | Contents |
|---|---|---|
::stdexec | <stdexec/...> | Things in (or proposed for) the C++ standard. |
::exec | <exec/...> | Generic additions and extensions. |
::nvexec | <nvexec/...> | NVIDIA-specific schedulers and customizations. |
The library itself is header-only — these steps are only needed if you want to build the test suite or the examples.
cmake -S . -B build -G Ninja
cmake --build build
ctest --test-dir build
To select a specific compiler:
cmake -S . -B build/clang -DCMAKE_CXX_COMPILER=$(which clang++)
cmake --build build/clang
To use libc++ with Clang:
cmake -S . -B build/libcxx \
-DCMAKE_CXX_COMPILER=$(which clang++) \
-DCMAKE_CXX_FLAGS=-stdlib=libc++
cmake --build build/libcxx
A VSCode extension is available that colorizes compiler diagnostics from stdexec, making the long template error messages much easier to read. Source and configuration: https://github.com/ericniebler/buildoutputcolorizer.
std::execution — the proposal accepted into C++26.io_uring.Contributions are welcome. Before opening a PR, please review:
CODE_OF_CONDUCT.mdMAINTAINERS.mddocs/CONTRIBUTING-docs.md for documentation contributions.Bug reports and feature requests belong in GitHub Issues; design discussion in GitHub Discussions.
If you reference stdexec in academic work, please cite the standards proposal:
@techreport{P2300,
author = {Niebler, Eric and Shoop, Kirk and Baker, Lewis and Dominiak, Michał and
Evtushenko, Georgy and Teodorescu, Lucian Radu and Howes, Lee and Garland,
Michael and Lelbach, Bryce Adelstein}
title = {{P2300R10}: \texttt{std::execution}},
institution = {ISO/IEC JTC1/SC22/WG21},
year = {2024},
url = {https://wg21.link/p2300}
}
stdexec is licensed under the Apache License 2.0 with LLVM Exceptions. See LICENSE.txt for the full text.