2013-05-26 3 views
1

는 예를 들어, 병렬에 대한 루프 구현이 있다고 가정 ConcRT parallel_for, 모든 작업을 하나의 루프 본문에 넣는 것이 좋습니다.최적의 크기는

for(size_t i = 0; i < size(); ++i) 
{ 
    DoSomething(a[i], b[i]); 
} 
for(size_t i = 0; i < size(); ++i) 
{ 
    DoSomethingElse(a[i], b[i]); 
} 

for(size_t i = 0; i < size(); ++i) 
{ 
    DoSomething(a[i], b[i]); 
    DoSomethingElse(a[i], b[i]); 
} 

갈 수있는 확실한 방법이 될 것입니다 두 번째 변종에 비해

하지만 처리 병렬 때있을 수있는 다른 고려 사항 :

다음 예제를 타고?

난 그냥 경우 옵션 1 (~ 평균 38ms 30ms의에) 빨리 두 번째보다 더 parallel_for 년대에 있었다했다. 하지만 병렬 알고리즘을 벤치마킹하는 데는 좋지 않습니다. 따라서 잘못 측정 한 것일 수 있습니다. 어쨌든 불행히도이 관찰을 위해 실제 코드 예제를 게시 할 수 없습니다.

은 추가 고려 엄지 손가락의 몇 가지 규칙이 있습니까하거나 시도하고 벤치 마크?

+0

나는, 두 번째 옵션은 더 나은 지역을 가지고 생각합니다. – Elazar

+0

컴파일러를 추측하려는 것 같습니다. 문제는 컴파일러에 따라 다르며 특히 최적화 수준에 달려 있습니다. 일부 컴파일러는 두 번째 예제에서 병렬 처리 기회를 인식 할만큼 충분히 똑똑 할 수 있습니다. 컴파일러와 병렬 코드 조각을 인식하는 방법에 대해 자세히 연구하십시오. 아마도'#pragma'가 관련되었을 것입니까? –

+0

관련 : http://stackoverflow.com/questions/8547778/why-is-one-loop-so-much-slower-than-two-loops/8547993#8547993 – inf

답변

0

그것은 당신이 DoSomething에서하는 일에 모든 많이 의존하는 것 및 DoSomethingElse

는 이제 DoSomething 당신이 그것을 루프의에서이 개체가 캐시에있을 것입니다 실행 이렇게하면 메모리에서 뭔가를 필요로한다고 가정 해 봅시다,하지만 때를 DoSomethin에서 DoSomethingElse으로 전환하면 메모리의 내용이 필요하므로 캐시의 개체가 변경되어 메모리에서 가져와야합니다.

다시 -not 확인이 당신이 그 방법에서 무엇을하고 있는지에 매우 많이 의존하는 경우입니다. 첫눈에서 는 - 성능에 어떤 다른이 안

DoSomething`이 너무 지저분없는 '경우