프로그래밍/OpenMP

OpenMP이용하여 Min,Max 계산

바람냥냥 2017. 7. 29. 14:02

알고리즘을 구현하다 보면 데이터에서 최소,최대값을 계산하는 일이 빈번합니다.


병렬처리 라이브러리중 하나인 OpenMP를 이용해서 

OpenMP를 사용 유무에 따른  최소,최대 계산을 해서 성능(tact time)을 비교해보았습니다.


그런데 debug모드와 release모드 결과가 상반된 결과가 나오는군요..


아래는 소스코드 일부이고 각각 debug와 release로 구동해서 소요시간을 측정해보았습니다.

------------------------------------------------------------------------------------------

printf("image size : [%dX%d]\n",A.rows,A.cols);

int iter = 0;

while(iter++ < 5)

{

    printf("[Iteration #%d]\n",iter);

int minvalue = INT_MAX;

int i = 0;

///////////// OpenMP TEST ////////////////

measuretact.start("OpenMP");

#pragma omp parallel for reduction(min:minvalue)

    for(i = 0; i < image_size; i++){

        if( minvalue > image[i])

            minvalue = image[i];

    }

measuretact.end();


///////////// Normal TEST ////////////////

minvalue = INT_MAX;

sum = 0;

    measuretact.start("Normal");

    for( i = 0; i < image_size; i++){

        if( minvalue > image[i])

            minvalue = image[i];

    }

    measuretact.end();

}


------------------------------------------------------------------------------------------


먼저 테스트 환경입니다.

테스트 영상은 3840x2160 UHD 영상

코드블럭스를 이용 gcc컴파일러를 사용하였습니다.

visual studio2010에서 지원하는 openmp 버전은 2.0 인데 min,max를 찾는 reduction 기능이 없습니다.

그래서 min,max 연산이 가능한 openmp3.0 이상 버전을 사용하기 위해 gcc컴파일러를 이용하였습니다.


debug 모드로 테스트한 경우입니다.

생각보다 빠르진 않지만 아무튼 openmp 사용한 경우가 normal보다  2배 정도 빠른 속도를 보이는 군요.




다음은 release 모드를 테스트 한경우입니다. 

??? 

openmp를 사용하지 않은 경우가 속도가 더 빠르네요..납득이 안됩니다.

거기다 속도는 0에 근접하는.. 영상 사이즈는 2160X3840인데 엄청나게 빠르게 처리 되는 군요.

구글에 검색해봐도 정확한 원인은 파악하지 못했습니다.

가설은 두가지입니다.

1. gcc자체컴파일러가 openmp병렬처리 적용보다 성능이 뛰어나다

2. min,max 계산하는 코드가 잘못되었다.


그러나 2번 같은 경우는 아래사이트에서 참고한거라 틀렸을거라고 생각은 안드는군요.

코드 자체도 심플하고 reduction의 기능이 병렬로 쓰레드별로 처리된 결과를 최종적으로 다시 한번

처리되는 기능이니깐요.





혹시나 min계산하는 반복문 부분이 처리되지 않고 그냥 넘어가버리는게 아닌가 의심이 들어

확인 코드를 추가하였습니다. 전체영상 픽셀수의 10개로 분할해서 중간에 계산된 min값을

출력하였습니다. 그리고 다음은 테스트 결과입니다.



혹시나 싶어서 누적연산을 사용하는 경우, 즉 reduction(+:sum) 같은 경우도 비슷한지 실험했는데 

이경우는 확실히 openmp를 사용한 경우가 더 빠른 결과를 보였습니다.

결국은 openmp의 min,max 기능이 최적화가 안되어있다는 이야기인걸까요?


정확한 원인을 파악하게 되면 다시 포스팅하도록 하겠습니다.