OpenMP를 이용한 병렬처리
듀얼코어를 넘어 매니코어 CUP가 보편화 되면서 병렬 프로그램에 대한 관심이 높아지고 있습니다.
OpenMP는 공유 메모리 환경에서 프로그램을 병렬화하는 표준입니다. (http://en.wikipedia.org/wiki/OpenMP)
예를들어 1000번을 반복하는 연산이 있다고 하면
단일쓰레드 환경에서는 다음과 같습니다.
for( int i = 0 ; i < 1000 ; ++i )
result[i] = srcA[i] * 256 + srcB[i] * 256;
하지만 2Core-CUP 환경에서는 다음과 같이 이루어 지는게 더 효과적일 것입니다.
Thread #1
for( int i = 0 ; i < 500 ; ++i )
result[i] = srcA[i] * 256 + srcB[i] * 256;
Thread #2
for( int i = 500 ; i < 1000 ; ++i )
result[i] = srcA[i] * 256 + srcB[i] * 256;
복잡도가 높은 반복 연산일 경우 병렬프로그래밍은 더욱 큰 효과를 나타냅니다.
우리가 사용하는 VS2005에서도 OpenMP를 사용할수 있습니다.
[프로젝트 속성 - C/C++ - 언어] 를 보시면 [OpenMP Support] 항목이 그것입니다.
#Include <omp.h>
int iCPU = omp_get_num_procs(); // cup 수를 얻어옵니다.
omp_set_num_threads(iCPU); // cup 수만큼 병렬하는것이 최적이겠죠.
#pragma omp parallel for
for( int i = 0 ; i < 1000 ; ++i )
result[i] = srcA[i] * 256 + srcB[i] * 256;
VS2008 에서 FeaturePack에서 TR1(차세대 C++ 표준 규격)을 지원하더니 VS2010 에서는 PPL(Parallel Partern Library)를 지원한다고 합니다.
OpenMP를 좀더 쉽고 편하게 사용할수 있게 되는다는군요.