C ++ 17 병렬`for_each`의 스레드 수를 제한 할 수 있습니까?


10

나는 사용한다 std::for_eachstd::execution::par 구조 벡터로 표현되는 거대한 입력에 대해 복잡한 계산을 수행 하는 데 합니다. 계산에는 하드웨어 (예 : 네트워크 또는 디스크 IO)와 관련된 지연이 필요하지 않으며 "단지 CPU"계산입니다. 저에게는 하드웨어 스레드가있는 OS 스레드를 더 만들지 않는 것이 합리적입니다. 그러나 Visual C ++ 2019는 평균 50 개의 스레드를 생성하며 12 개의 하드웨어 스레드 만있는 경우에도 최대 500 개의 스레드를 생성합니다.

병렬 스레드를 제한 할 수있는 방법이 거기 카운트 hardware_concurrencystd::for_each하고 std::execution::par, 또는 계산 합리적인 스레드를 함께 사용하여 사용자 지정 코드로되어 만들 수있는 유일한 방법은 std::thread?


open-std.org/jtc1/sc22/wg21/docs/papers/2016/…- 하지만 여전히 제안하는 것 같아요?
Caramiriel

1
이것이 언젠가 표준이 될지라도 스레드 풀의 주요 문제는 헤더의 std::for_each다른 알고리즘 보다 훨씬 낮은 수준이라는 것 <algorithm>입니다. 기본 아이디어 std::execution::par는 병렬 코드를 순차 코드처럼 단순하게 만들고 코드 및 의미 변경을 최소화하면서 기존 알고리즘을 병렬화하는 것입니다.
Vitalii

답변:


5

C ++ 17 병렬의 스레드 수를 제한 할 수 for_each있습니까?

아니요, 적어도 C ++ 17에는 없습니다. 그러나 executors표준에 대한 제안 이 있는데, 기본적으로 고급 STL 알고리즘 인터페이스의 실행 컨텍스트 (위치 및 시간)에 영향을 줄 수 있습니다.

thread_pool pool{ std::thread::hardware_concurrency() };
auto exec = pool.executor();
std::for_each(std::execution::par.on(exec), begin(data), end(data), some_operation);

그때까지는 Visual Studio state 개발자와 같이 전반적인 성능에 가장 적합한 것이 무엇인지 알고있는 컴파일러 공급 업체를 신뢰해야합니다 .

구현 일정은 Windows 시스템 스레드 풀에 의해 처리됩니다. 스레드 풀은 시스템의 다른 스레드가 수행하는 작업, 대기중인 커널 리소스 및 기타와 같은 표준 라이브러리에서 사용할 수없는 정보를 이용합니다. 더 많은 스레드를 작성할시기와 종료시기를 선택합니다. 또한 C ++를 사용하지 않는 구성 요소를 포함하여 다른 시스템 구성 요소와 공유됩니다.

다른 옵션은 표준 라이브러리에만 의존하는 것을 포기하고 이미 새로운 제안을 특징으로하는 STL 구현을 사용하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.