2012-06-22 4 views
2

OpenMP를 사용하여 응용 프로그램을 작성했습니다. 나는 두 개의 섹션을 만들어 두 개의 객체를 넣었습니다. 그들 각각은 거의 22-23 초를 실행하는 방법을 호출합니다. 두 섹션은 모두 독립적입니다.OpenMP - 섹션

num_threads(1)으로 설정하면 응용 프로그램 실행에 46 초가 걸립니다. 2 × 23 = 46이기 때문에 괜찮습니다.

내가 num_threads(2)으로 설정하면 응용 프로그램을 실행하는 데 35 초가 걸리지 만 ~ 25 초가 걸렸습니다.

내가 말했듯이 섹션은 독립적입니다. cm1cm2은 외부 변수를 사용하지 않습니다. 그래서, 누군가 내 앱이 내가 예상했던 것보다 10 초 더 느린 이유를 말할 수 있습니까? 낮은 수준의 동기화가 있습니까?

t1 = clock(); 
#pragma omp parallel num_threads(2) 
{ 
    #pragma omp sections 
    { 
     #pragma omp section 
     { 
      Cam cm1; 
      cm1.solveUsingCost(); 
     } 

     #pragma omp section 
     { 
      Cam cm2; 
      cm2.solveUsingTime(); 
     } 
    } 
} 
t2 = clock(); 
+0

'clock()'은 실제 시간 (또는 벽시계)이 아닌 CPU 시간을 측정한다는 것을 알고 계실 것입니다. –

+0

여기에 상관 없다고 생각합니다. 나는 스톱워치를 사용할 수 있었고 여전히 차이점을 볼 수있었습니다. – user1475838

+2

다른 사람들이 귀하의 질문을 읽는 것에 대한 언급입니다 - omp_get_wtime() 대신에'clock()'을 사용하는 대부분의 사람들은 OpenMP를 사용하여 속도가 향상되는 것을 보지 못합니다 :) Intel VTune (상용 라이센스 필요) 또는 하드웨어 성능 카운터를 기록하는 유사한 성능 도구는 성능 문제를 스레딩하는 데 많은 도움이 될 수 있습니다. –

답변

2

몇 개의 CPU 또는 코어가 있습니까? 예를 들어 물리적 코어가 2 개인 경우 그 중 하나는 다른 모든 프로그램 + OS를 처리해야하므로 스레드 중 하나가 느려집니다.

또 다른 가능성은 CPU의 L3 캐시가 L3 캐시에서 한 번에 하나의 계산 데이터를 저장하는 데 충분하다는 것입니다. 그러나 병렬로 2 번 수행하면 메모리가 두 배로 사용되므로 L3 캐시의 일부 메모리가 램으로 전송되어야합니다 (대부분의 멀티 코어 CPU는 코어간에 L3 캐시를 공유합니다). 이렇게하면 계산 속도가 느려지고 설명 된 결과가 발생할 수 있습니다.

그러나 이것은 단지 추측 일 뿐이므로 계산을 병렬로 수행 할 때 요인 2 속도 게인이없는 이유가 더 많을 수 있습니다.

업데이트 : CPU가 i5 : i5 및 i7 프로세서라고 언급 할 때까지 잊어 버린 것은 물론, 3.3에서 3.6GHz까지의 경우에 이보다 더 빠른 클록 속도를 향상시키는이 "터보 부스트"기능이 있습니다. 그러나 이것은 대부분의 코어가 유휴 상태 일 때만 수행됩니다 (열적 이유로 생각합니다). 그리고 단일 코어가 증가됩니다. 따라서 두 개의 코어는 더 낮은 클럭 속도로 작동하기 때문에 한 코어의 속도가 두 배가되지 않습니다.

+0

Intel i5 3550 - 4cores. – user1475838

+0

좋아, 그럼 내 처음 추측해서는 안됩니다. 계산에 필요한 메모리 양을 대략 알고 있습니까? 빠른 검색은 CPU가 6MB의 공유 L3 캐시를 가지고 있다고 말합니다. – Haatschii

+0

예, i5의 L3 크기는 6MB입니다. 작업 관리자에서 내 응용 프로그램은 최대 27MB를 사용하고 있습니다. – user1475838

0

이전 답변과 의견에 대한 답변을 보면 내 생각에 두 가지 기능 인 solveUsingCost()solveUsingTime()은 메모리 사용량이 많거나 메모리 대역폭이 제한되어 있습니다.

정확히 컴퓨팅은 무엇입니까? 그리고 어떻게? 대략적으로 메모리 액세스 당 산술 연산의 비율은 얼마입니까? 메모리 접근 패턴은 어떻게됩니까? 큰 배열을 여러 번 실행합니까?