본문 바로가기

programming/OpenMP

OpenMP

OpenMP에 대한 참고서적, 사이트, 자료 등등 있으면 댓글을 달아주시거나, seolis85@gmail.com 으로 보내주시면

감사하겠습니다^^ (정리해서 블로그에 올리도록 하겠습니다~)

참고사이트:
OenMP MSDN :  http://msdn.microsoft.com/en-us/library/tt15eb9t.aspx
OpenMP : http://openmp.org/wp/
누군가의 번역 : http://jacking75.cafe24.com/MSDN_MagaZine/2005-10-3.htm
정리된 사이트: 1) http://sunyzero.egloos.com/4227785
                     2) http://tepet.blog.me/140103106452
                     3) http://himskim.egloos.com/3261640 (by김명신님) 추천해요

 

OpenMP란? (http://mjlulna.egloos.com/1959634 ) By 루나님


OpenMP는 공유 메모리 환경에서 프로그램을 병렬화하는 표준이다.
OpenMP는 컴파일러 지시자, 런타임 루틴, 그리고 포트란, C, C++ 프로그램에서 공유 메모리 병렬화를 지정할 때 프로그래머가 사용할 수 있는 환경 변수 등을 제공한다.

OpenMP 컴파일러 지시자는 프로그램 내에서 사용되며, OpenMP를 인식하는 컴파일러가 Multi-thread를 이용해서 병렬로 실행되는 실행파일을 생성하도록 지시한다.
(최고의 퍼포먼스를 얻기 위해 튜닝을 할 때를 제외하고) 소스 코드의 많은 수정이 필요없다.
OpenMP컴파일러 지시자는 사용자가 다양한 아키텍쳐와 시스템 상에서 프로그램을 병렬화 하기 위한 우아하고, 일관적이고 fortable한 인터페이스를 사용 가능하도록 한다. OpenMP는 광법위하게 채용되는 표준으로써 Sun, IBM, Intel, SGI 등이 지원하고 있다.

OpenMP는 thread를 생성하고 관리해 줌으로써 병렬 프로그래밍을 좀 더 발전된 레벨로 끌어 올려준다.
사용자가 해야할 일은 단순히 적절한 컴파일러 지시자를 소스 프로그램에 삽입시키고 OpenMP를 지원하는 컴파일러를 이용해서 프로그램을 컴파일 하고 적절한 컴파일러 옵션을 사용하는 것이다.
컴파일러는 컴파일러 지시자를 해석하고 코드를 병렬화 시킨다. OpenMP를 지원하지 않는 컴파일러는 OpenMP를 조용히 무시해버린다.


(영문파일 입니다. 번역해주실분 =ㅇ=;;)

간단예제 소스입니다. 퍼옴 : http://www.gisdeveloper.co.kr/


#include "stdafx.h"
#include <omp.h> //openmp library Include!!
#include <time.h>
#define num_steps 20000000

int _tmain(int argc, _TCHAR* argv[])

double start, stop;
 double e, pi, factorial, product;
 int i;

 start = clock();

#pragma omp parallel sections num_threads(2) 
 //#pragma는 2개의 스레드(num_threads(2))로 실행 구역(section)을 나누겠다는 의미입니다
 {
#pragma omp section  //e 영역의 블럭
  {

   printf("e started\n"); // 1. 단계: e구하기
   e = 1;
   factorial = 1;

   for (i = 1; i<num_steps; i++) {
    factorial *= i;
    e += 1.0/factorial;
   }

   printf("e(%lf) done\n", e);
  }

#pragma omp section  //phi 영역의 블럭
  {
   printf("pi started\n"); // 2. 단계: phi 구하기

   pi = 0;
   for (i = 0; i < num_steps*10; i++) {
    pi += 1.0/(i*4.0 + 1.0);
    pi -= 1.0/(i*4.0 + 3.0);
   }

   pi = pi * 4.0;
   printf("pi(%lf) done\n", pi);
  }
 }

 /*여기서 중요한 것은 동기화인데, e와 phi를 계산해서 합하는 것이 최종적인 목표이므로
 e의 계산과 phi의 계산이 완전이 완료되어야만 e와 phi를 합할 수가 있다.
 OpenMP는 #pragma omp parallel sections num_threads를 통해 이 전처리가 규정한 블럭의 코드를
자동으로 동기화 시켜줍니다.*/
 
 product = e + pi; // 3. 단계: e와 phi 합하기

 stop = clock();

 printf("Reached result %f in %.3f seconds\n", 
 product, (stop-start)/1000);

 return 0;
}


OpenMP Spec 파일입니다.  http://openmp.org/wp/ 여기서 담아왔습니다.

  • Version 3.0 Summary Card C/C++ (November, 2008) (PDF)
  • Version 3.0 Complete Specifications - (May, 2008). (PDF)
  • 출처: http://himskim.egloos.com/3261640 에서 퍼왔습니다. PDF 파일로 만들었으니 퍼가실때는 꼭 이분 출처를 밝혀주세요