2011-03-31 12 views
2

TPL은 여러 병렬 호출을 어떻게 처리합니까?작업 병렬 라이브러리 및 다중 병렬 작업

예 : 관련없는 두 개의 콜렉션을 병렬로 처리하려고합니다. 이 작동하지만 난 TPL 스케줄러는 3 별도의 처리 방법 궁금

Parallel.Invoke(() => Parallel.ForEach(collection1,...), 
       () => Parallel.ForEach(collection2,...)) 

:

은 현재이 같은 그것을 할 (시간이 오래 걸릴 각 컬렉션의 하나 개의 항목에 대해 그 처리를 가정) 호출합니다.

다르게해야합니까? 첫째

답변

2

이 중요한 것 :

  • 당신이 오랫동안 Parallel.For/Parallel.ForEach 워크로드 (또는 루프 위임에 차단의 모든 유형)에 반복을 실행 한 경우, 당신은 항상 동시성을 지정해야합니다 레벨은 ParallelOptions.MaxDegreeOfParallelism을 사용합니다. 이는 병렬 루프 구현이보다 세분화 된 작업 부하에 최적화되어 있고 반복 실행 시간이 길어질 경우 추가 작업자 스레드가 삽입 될 수 있기 때문입니다.

  • 동시 병렬 루프를 시작하면 이미 2 개의 루프가 CPU 리소스를 놓고 경쟁하게됩니다. 당신이 장기 실행 반복하지 않았다 그래서 경우에도, 그것은 각 루프의 MAXDOP를 제한하여 명시 적으로 부하를 분산하는 것이 현명 할 것이라고 대답하기

(실제로 나는 각 Environment.ProcessorCount/2로 갈 것) 원래 질문 :

... 3 별도의 원용은 ...

예, TPL은 잘 3 개 이상의 개별 Parallel.Invokes을 처리합니다. 이 같은 중첩 된 병렬 처리 시나리오에서 스레드를 낭비하지 않도록 최적화되었습니다.

다르게해야합니까?

적어도 위에서 설명한대로 MaxDOP를 사용해야합니다. 그러나 다음을 기반으로 다른 DOP 전략을 고를 수 있습니다.

  • 컬렉션에 대략 동일한 양의 작업이 필요합니까?
  • 루프 대리인에 차단이 있습니까?
+0

감사합니다. 왜 오랜 반복을위한 여분의 스레드를 돌리는 것이 나쁜 것입니까? 대리인에 차단 (IO)이 많이 있습니다. MaxDOP가 낮 으면 모든 스레드가 대기하는 위험이 증가하지 않을까요? – adrianm

+0

반복이 CPU 바인딩 (즉, 비 차단) 인 경우 악화 될 수 있습니다.이 경우 코어 수가 #보다 많으므로 매우 비효율적 인 결과를 초래할 수 있습니다. – HYildiz

+0

그러나 반복이 막히는 경우에는 일반적으로 말한대로 일부 * 초과 가입이있는 것이 좋습니다. TPL에는 불행하게도 얼마나 많은 병렬 반복이 차단되는지 추적하고 이에 따라 DOP를 제어하는 ​​메커니즘이 없습니다.따라서 과부하 수준이 차단 특성의 추정을 기반으로 프로그래머에 의해 설정되는 것이 가장 좋습니다. – HYildiz

관련 문제