Private/openCV

병렬 처리를 위한 openMP

익명132 2017. 7. 12. 17:34

OpenMP : API for multi-thread application

set of compiler directive, library function, environment variable


#pragma : 컴파일러 지시자의 시작

 -> 어느 부분부터 어느 부분까지를 병렬적으로 수행할 지 알아야 한다.

#pragma omp parallel{

}

이 부분을 벗어나도 바로 쓰레드를 종료하지 않는다.

적용은 어마무시하게 간단하다. (비주얼스튜디오를 쓰니까..)

프로젝트 속성창에서 C/C++ > Language > Open MP Support 를 Yes으로 설정해주고,

위의 문장을 추가하면 된다~~~~~정말 간단.

동기화 문제는 어떻게 해결하는가? 값을 갱신하는 부분을 동시에 수행하지 못하도록 락을 걸어야 겠다.

critical 이라는 construct를 사용해야한다. 하지만 접근을 제한하면 성능에 손해를 보기 때문에 reduction으로 변수를 선언하고,

한번에 재계산을 한다.


#pragma omp for

는 한계가 있다. iterator로 사용하는 변수는 부호가 있어야 하며, for 루프의 조건문은 부등호 중 하나, < 나 <= 에는 증감연산이 +여야한다.

iterator 변수는 루프내에서 값을 변경할 수 없다.


schedule 도 정해줄 수 있다.  (헤더파일 opm.h) 

#pragma omp parallel for schedule(kind, chunk size)

static(loop반복을 thread 수로 나눈 chuck 만큼 작업 , default), 

dynamic(각 작업을 queueing 해서 thread가 차례로 job을 가져가게 한다.), 

guided(점점 chuck size 줄인다), runtime(환경 변수에 지정된 값으로 스케쥴링)


참고 사이트 : http://himskim.egloos.com/3266925