본문 바로가기

Programming

OpenMP의 성능향상을 위한 시도

OpenMP를 통하여 가장 큰 이득을 볼 수 있는 부분은 단연코

for 등의 루프에 의한 반복연산을 각각의 프로세서로 분할하여 계산하는 것일텐데,

일반적으로 분할하는 방법은

예를 들어서

for( int i = 0; i < NUM ; i++)
.....


여기에서 NUM을 프로세서의 갯수로 나누어 각각 일정한 수의 계산을 가져가서 계산을하고

이 값을 토대로 다음스텝으로 넘어가는 작업이 되겠다.

예 - 4 core 시스템이라면 ,

NODE 1 : 0~NUM/4
NODE 2 : NUM/4~NUM/2
NODE 3:  NUM/2~NUM3/4
NODE 4:  NUM3/4~NUM

이런식으로 작업을 가져가게 될텐데, 각각의 작업이 계산량이 거의 일정하다면 큰 문제가

되지 않는다. 그러나, 계산량에 극심하게 차이가 나는 경우에는 어떤 노드는 한참 일하는 중인데

어떤 노드는 일 끝내고 노는 상황이 벌어지게 된다.


따라서, 적절한 계산의 분배가 요구되는데, 이는 다음의 블로그에서 보이는 바와 같이...

http://himskim.egloos.com/3271423




#pragma omp for schedule( 방법 )

을 이용하여 수행할 수 있다.



static이 아닌 dynamic 혹은 guided 등의 방법을 적용할 경우 계산량의 불일치로 인한

효율 저하를 막을 수 있다. 쉬는 프로세서따위는 용납하면 안되는거다;;
 
각 키워드의 사용방법은 위에 링크해둔 블로그에 잘 나와있으니 해당내용을 참고하시기를...^^;;


참고로, 저의 경우에는 static -> guided 로 변경했을때, 약 40%의 속도향상 효과가 있었네요

dynamic으로 바꿨을 때는 35% 정도... 결론적으로는 guided가 조금 더 나았습니다.

물론 이것도 진리의 case by case 겠지요^^;