개발 라이브러리 & 툴

[MPP] Introduction to OpenMP

하늘흐늘 2009. 9. 12. 02:00
반응형

OpenMP specification ver3.pdf
다운로드

OpenMP란 멀티쓰레드 기법을 이용하여 병렬처리를 간단히 구현하는 API입니다. C/C++ 그리고 Fortran을 지원하며 C/C++에서는 compiler directives, 라이브러리 루틴, 환경 변수로 이루어지며 실제 사용은 compiler directives로 간단히 할 수 있습니다.

 내부적으로는 master쓰레드가 CPU 코어 개수만큼 쓰레드를 생성하여 특정 블럭 내의 내용을 각각의 코어가 병렬적으로 처리할 수 있게 할당하여 처리합니다. 병렬처리 자체는 루프 내의 내용 나누기, 특정 코드내의 섹션 나누기로 크게 나누어 집니다.
 하루정도 간단히 사용한 경험으로는 간단한 컴파일 디렉티브 만을 가지고 하나의 함수 내의 처리를 CPU 코어 개수만큼 병렬로 가져가 성능 향상을 이룬다는 것이 굉장히 유용해 보입니다. 간단한 예를 하나 보면 아래와 같습니다.

int main(int argc, char **argv) 

{
    const int N = 100000;
    int i, a[N];

//아래 OpenMP directive는 cpu코어 개수만큼 i 루프를 분배하여 동시에 처리하라는 의미입니다.
    #pragma omp parallel for
    for (i = 0; i < N; i++)
        a[i] = 2 * i;

    return 0;
}

  위의 코드는 a배열의 수를 2배하는 것으로 i loop는 cpu core개수 만큼으로 나누어져 실행됩니다. 즉 듀얼코어인 경우 2개의 쓰레드로 동작하며 각각의 코어는 i/2 만큼 동시에 처리하여 최대 2배의 속도의 향상을 가져오게 됩니다. OpenMP는 다양한 컴파일러에서 지원하며 윈도우와 같은 경우 Visual Studio 2005, 2008에서 지원합니다. 위의 코드를 컴파일 하기 위해서는 프로젝트 탭에서 C/C++ -> Language -> OpenMP Support를 yes로 만들어 주어야 합니다.
  OpenMP는 CPU core 개수의 변화에 따라 성능 향상이 자동으로 일어나며 단순하며 쉽게 만들 수 있고 또한 쓰레드 구조로의 변경도 쉽다는 장점을 가지고 있습니다. 최대 N배 만큼의 성능 향상을 목표로 하지만 논리적으로는 암달의 법칙만큼, 물리적으로는 메모리 밴드폭을 제외한 혹은 경쟁하는 공유 메모리로 인한 성능 하락을 제외한 만큼의 성능 향상이 있다 단점을 가지고 있습니다.
 수학 계산 혹은 3D Game과 같이 싱글쓰레드 기반의 프로그래밍을 하는 분들에게 굉장히 유용한 라이브러리 인듯 보입니다. 더욱이 쓰레드에 대한 지식을 요구하지 않아 전반적인 프로그래밍 난이도도 높지 않습니다. 마지막으로 OpenMP는 1997년 10월에 Fortran용으로 첫 버전이, 이듬해 C/C++용 버전이 나온 그리 오래되지 않은 API로 3.0 현재 최신 버전 입니다. 이 글은 wikipedia님의 OpenMP에서 필요한 부분을 발취하여 썼으며 아래와 같은 글들을 참조하면 좀 더 깊게 알 수 있습니다.


Wikipedia OpenMP

wikipedia답게 OpenMP에 대하여 핵심만 잘 정리되어 있습니다. 근디, 글이 영문인데다가 늘어지는 문체라 한눈에 들어오지 않아 굉장히 졸립습니다. ^^;

OpenMP.org

OpenMP관련 공식사이트 입니다.

로봇은 나의 인생, 멀티쓰레드 프로그래밍.. OpenMP로 처리해보자.

코드 블록을 나누어 병렬처리하는 예가 인상적입니다. 한글로 된 포스트로 수학계산의 이용 예로 보시면 좋을 듯 합니다.

반응형