std::execution:: bulk, std::execution:: bulk_chunked, std::execution:: bulk_unchunked
|
헤더에 정의됨
<execution>
|
||
|
std
::
execution
::
sender
auto
bulk
(
std
::
execution
::
sender
auto
input,
|
(1) | (C++26부터) |
|
std
::
execution
::
sender
auto
bulk_chunked
(
std
::
execution
::
sender
auto
input,
|
(2) | (C++26부터) |
|
std
::
execution
::
sender
auto
bulk_unchunked
(
std
::
execution
::
sender
auto
input,
|
(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()보다 빠르게 실행됩니다