인덱스 된 작업 집합을 처리하기 위해 Visual Studio 2010의 PPL (Parallel Patterns Library)의 Concurrency::parallel_for()
을 사용하고 있습니다. 일반적으로 인덱스 집합은 동시에 실행할 수있는 스레드). 긴 계산을하기 전에 각 작업은 공유 자원 관리자에게 개인 작업 저장소 자원을 요청하여 시작합니다 (경우에 따라 작업 별 메모리 맵 파일에 대한보기가 있지만 각 작업이 같을 경우 스토리 라인이 같을 것이라고 생각합니다. 공유 힙에서 개인 메모리 할당을 요청했습니다).Concurrency :: parallel_for (PPL)에서 너무 많은 스레드가 생성되고 있습니다.
공유 리소스 관리자의 사용은 Concurrency::critical_section
과 동기화되며 여기에서 문제가 시작됩니다. 첫 번째 스레드/작업이 중요 섹션에 있고 두 번째 작업이 요청을하면 첫 번째 작업의 요청이 완료 될 때까지 대기해야합니다 처리됩니다. PPL은 다음과 같이 생각합니다 :이 스레드가 대기 중이고 더 많은 작업이 필요하므로 다른 스레드가 생성되어 최대 870 개의 스레드가 대부분 동일한 자원 관리자에서 대기하게됩니다.
자원 요청을 처리하는 것이 전체 작업 중 일부에 지나지 않기 때문에 해당 부분의 PPL에게 말을 걸라고 말하고 싶습니다. 대기 또는 협동 블록으로 인해 새 스레드가 여기 작업 스레드의 표시된 부분 및 내 질문은 다음과 같습니다. 특정 스레드 섹션에서 새 스레드를 만들지 못하게 할 수있는 경우, 협력하여을 차단하더라도 마찬가지입니다. 스레드의 처리 경로를 따라 다른 블록에 새로운 스레드를 만들지는 않겠지 만 2 * (하이퍼) 코어의 개수는 말할 필요가 없습니다. 내가 지금까지 고려했다
대안 :
큐 업 작업과 스레드의 제한된 수의 큐를 처리합니다. 문제 : PPL의 parallel_for가 그 일을 직접 수행 할 수 있기를 바랍니다.
Concurrency::combinable<Resource> resourceSet
;Concurrency::parallel_for
외부에서resourceSet.local()
을 한 번 초기화하면 리소스를 재사용하여 리소스 요청 수를 스레드 수 (작업 수보다 적어야 함)로 줄입니다. 문제 :이 최적화로 인해 불필요한 스레드 생성이 방지되지 않습니다.parallel_for
루프 외부의 각 작업에 필요한 리소스를 미리 할당하십시오. 문제 : 너무 많은 시스템 리소스를 요청하는 반면 자원의 양은 스레드/코어의 수를 제한하는 것이 OK 일 것입니다 (폭발하지 않은 경우).
(... 다시 예를 높일 수)는 x가
boost::thread::hardware_concurrency()
이다 병렬에서 작업 'X'작업보다는 더 이상 없을 것입니다 보장, 당신의 작품 큐를 채워 HTTP : //stackoverflow.com/questions/9990363/thread-ids-with-ppl-and-parallel-memory-allocation? rq = 1 이것은이 질문과 매우 비슷합니다. –