Namespaces
Variants

std::execution:: bulk, std::execution:: bulk_chunked, std::execution:: bulk_unchunked

From cppreference.net
헤더에 정의됨 <execution>
std :: execution :: sender

auto bulk ( std :: execution :: sender auto input,
std:: integral auto size,
auto && policy,
std:: invocable < decltype ( size ) ,

/*values-sent-by*/ ( input ) ... > function ) ;
(1) (C++26부터)
std :: execution :: sender

auto bulk_chunked ( std :: execution :: sender auto input,
std:: integral auto size,
auto && policy,
std:: invocable < decltype ( size ) , decltype ( size ) ,

/*values-sent-by*/ ( input ) ... > function2 ) ;
(2) (C++26부터)
std :: execution :: sender

auto bulk_unchunked ( std :: execution :: sender auto input,
std:: integral auto size,
std:: invocable < decltype ( size ) , decltype ( size ) ,

/*values-sent-by*/ ( input ) ... > function ) ;
(3) (C++26부터)

목차

매개변수

input - 실행 시 함수가 실행되는 값들을 전송하는 sender
policy - execution policy 가 첨부된 function / function2
function - 범위 [ 0 , size ) 내의 모든 인덱스에 대해 호출될 수 있는 invocable. input sender가 생성한 값들도 함께 전달됨
function2 - function 과 동일하지만 ( b , e ) 인덱스 쌍으로 호출됨 ( b < e ). [ [ 0 , size ) 범위의 각 인덱스 i 에 대해 b <= i < e 를 만족하는 정확히 하나의 function2 호출이 존재함

반환값

입력 발신자가 설명하는 태스크 그래프를 설명하는 발신자를 반환하며, 범위 내 인덱스와 함께 제공된 함수를 호출하는 추가 노드가 포함됩니다. [ 0 , size ) , 입력 발신자가 전송한 값들도 인수로 함께 전달합니다.

function / function2 는 반환된 sender가 시작되기 전까지 실행을 시작하지 않음이 보장됩니다.

오류 완성

input 을 통해 전달된 모든 오류는 전달됩니다.

또한, 발신자는 다음을 포함하는 std::exception_ptr 오류로 완료할 수 있습니다:

  • function 에 의해 발생하는 모든 예외
  • std::bad_alloc - 구현체가 필요한 자원 할당에 실패할 경우
  • std::runtime_error 에서 파생된 예외 - 기타 내부 오류의 경우 (예: 실행 컨텍스트에서 호출자로 예외를 전파할 수 없는 경우)

취소

사용자 정의되지 않은 std::execution::bulk , std::execution::bulk_chunk std::execution::bulk_unchunked input 으로부터 전달된 중지 완료 신호를 전달합니다. 이들은 중지 완료 신호를 생성하기 위한 추가 메커니즘을 제공하지 않습니다.

참고 사항

std::execution::bulk std::execution::bulk_chunked 를 호출할 때, function / function2 의 서로 다른 호출들이 동일한 실행 에이전트에서 발생할 수 있습니다.

std::execution::bulk_unchunked 를 호출할 때, function 의 서로 다른 호출들은 서로 다른 실행 에이전트에서 발생해야 합니다.

std::execution::bulk 의 기본 구현은 std::execution::bulk_chunked 를 기반으로 합니다. std::execution::bulk 를 사용자 정의하는 것이 가능하지만, 대부분의 경우 std::execution::bulk_chunked 만 사용자 정의될 것으로 예상됩니다.

std::execution::bulk std::execution::bulk_chunked 에 대한 사용자 정의가 없을 경우, std::execution::bulk std::execution::bulk_chunk 의 동작은 function 을 직렬로 실행하는 것이며, 이는 특별히 유용하지 않습니다. 구현체들은 서로 다른 스케줄러에서 std::execution::bulk std::execution::bulk_chunked 를 실행할 때 더 유용하게 만들 사용자 정의 기능을 제공할 것으로 기대됩니다.

std::execution::bulk_unchunked function 이 서로 다른 호출 간에 의존성을 가질 수 있고, 동시적 진행 보장(병렬 진행만으로는 부족함)이 필요할 때 사용하기 위한 것입니다. 크기가 1000인 std::execution::bulk_unchunked 를 실행하려면 1000개의 실행 에이전트(예: 스레드)가 동시에 실행되어야 합니다.

std::execution::bulk_unchunked 는 실행 정책을 요구하지 않습니다. 왜냐하면 function 이 이미 동시에 실행될 수 있을 것으로 예상되기 때문입니다.

예제

execution::bulk 의 가능한 사용법.

std::vector<double> x;
std::vector<double> y;
//...
sender auto process_elements
    = just(get_coefficient())
    | bulk(x.size(), [&](size_t i, double a)
    {
        y[i] = a * x[i] + y[i];
    });
// process_elements는 계수 `a`를 얻기 위해 함수를 호출하고 이를 사용하여
//   y[i] = a * x[i] + y[i]
// 연산을 범위 [0, x.size()) 내의 각 `i`에 대해 실행하는 작업을 설명합니다

execution::bulk_chunked 의 가능한 사용법.

std::vector<std::uint32_t> data = ...;
std::atomic<std::uint32_t> sum{0};
sender auto s = bulk_chunked(just(), par, 100000,
    [&sum, &data](int begin, int end)
    {
        auto partial_sum = std::accumulate(data.begin() + begin, data.begin() + end, 0U);
        sum.fetch_add(partial_sum);
    });
// 원자 객체는 100,000번 접근되지 않으며; bulk()보다 빠르게 실행됩니다