블로그는 귀차니즘

First Sensation
  • 공지
  • 지역로그
  • 태그
  • 방명록

OpenMP 라고 아십니까??

Programming Tip 2008/07/27 22:37 귀차니스트
  VS.net 2008에서 몇일 전 컴파일러 옵션에 대해서 이렇게 저렇게 조절을 하면서 저도 처음으로 OpenMP라는 옵션이 있다는 것을 알게되었습니다. 그냥 이름만 딱 봤을땐 Multi Process에 관련된 기능이라는 느낌이 오더군요. 예전에 C#에서 멀티 프로세싱에 관련된 어떠한 라이브러리에 대한 소개를 보았기 때문에 혹시 그런 종류가 아닐까 했습니다.
  찾아보니 위에 언급한 라이브러리 부류더군요. 다만 다른 점은 Directive로 정의된다는 것일까요. 뭐 일단 OpenMP의 특징은 "공유 메모리를 사용하는 환경의 병렬화 프로그래밍의 표준"입니다. 고로 다른 플랫폼에서도 사용할 수 있습니다. 제가 찾아보니 리눅스에서도 가능하고, 썬 스튜디오 컴파일러에서도 가능하군요. 썬 스튜디오 컴파일러에서 된다면 x86서버 쪽일지라도 솔라리스에서 될지도 모르겠군요. 일단 Open그대로 여러가지 환경에서 사용될 수 있다는 것에 대해서는 무척 환영합니다. 사실 이런 기능이 하나, 둘 추가될 때마다 C++이란 언어가 괴물이 되어간다는 생각을 떨쳐버릴수가 없군요. 일단  간단한 예는 아래와 같더군요.

Atomic.cpp (Language : cpp)
  1. // omp_atomic.cpp
  2. // compile with: /openmp
  3. #include <stdio.h>
  4. #include <omp.h>
  5.  
  6. #define MAX 10
  7.  
  8. int main() {
  9.    int count = 0;
  10.    #pragma omp parallel num_threads(MAX)
  11.    {
  12.       #pragma omp atomic
  13.       count++;
  14.    }
  15.    printf_s("Number of threads: %d\n", count);
  16. }

  Directive로 이루어지다 보니 num_threads에 해당하는 Thread의 개수를 지정하여 아래의 블럭을 실행하는 쓰레드를 MAX개수 만큼 생성하여 해당 atomic에 대한 Multiple Write Protect를 수행하게 됩니다. 결국 수행하는 것만으로도 CPU에 대한 쓰레드 점유를 늘릴 수 있다는 거죠. 굳이 쓰레드를 여러가지 써가면서 작동하는 코드를 직접 써주지 않아도 된다는 말이됩니다.
  물론 Thread 라는게 실질적으로 하나의 CPU에서 돌아갈 때는 Register에 자료를 저장한 다음, 다음에 수행해야 할 명령에 의하여 자료가 조작되기 때문에 돌아가는 속도가 빠를 수도 있기 때문에, 메모리에 액세스하여야 한다는 점을 유의하여 코드를 작성해야 합니다.
  그리고 무조건 적인 Directive로만으로 이루어진 것은 아니더군요. 언어에 맞도록 lib를 통한 해당 헤더를 인클루드하게 되면 OpenMP에 해당하는 함수를 사용할 수도 있습니다.

num_thread.cpp (Language : cpp)
  1. // omp_get_num_threads.cpp
  2. // compile with: /openmp
  3. #include <stdio.h>
  4. #include <omp.h>
  5.  
  6. int main()
  7. {
  8.     omp_set_num_threads(4);
  9.     printf_s("%d\n", omp_get_num_threads( ));
  10.     #pragma omp parallel
  11.         #pragma omp master
  12.         {
  13.             printf_s("%d\n", omp_get_num_threads( ));
  14.         }
  15.  
  16.     printf_s("%d\n", omp_get_num_threads( ));
  17.  
  18.     #pragma omp parallel num_threads(3)
  19.         #pragma omp master
  20.         {
  21.             printf_s("%d\n", omp_get_num_threads( ));
  22.         }
  23.  
  24.     printf_s("%d\n", omp_get_num_threads( ));
  25. }

  결과는 MSDN에 존재하는 대로 1, 4, 1, 3, 1 그대로 나오더군요. 기본적으로 해당하는 Directive 명령어들과 연계가 되어 작동하는것 같군요. 뭐 결과를 보면 그렇게 말할 수 밖에 없겠습니다. #pragma pack(1)과 같이 기존 코드 생성에 해당하는 것을 변형시키는 지시자에 비하여, 실질적으로 생성되는 코드가 다르겠지만 사용자가 사용하는 프로그래머 측면에서는 결과를 모르게 사용할 수 있게 했다는 것에 대하여 큰 가산점을 주고 싶군요.
  왠지 여러가지를 살펴보면서 얻는게 꽤 많은 것 같은데, 다들 유용하게 사용해보셨으면 좋겠군요^^;

http://msdn.microsoft.com/ko-kr/library/tt15eb9t.aspx
크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Programming Tip" 분류의 다른 글

심심해서 구현해본 그래픽 요소 (0)2008/07/03
Child Window Mouse Message 문제. (0)2008/07/01
버퍼 오버플로우, 오버런이란?? (0)2008/04/27
GDI+ 사용 시 Smart Pointer 란?? (0)2008/04/12
Com Library in C++ Builder - C++ 빌더에서 Com 라이브러리, .Net라이브러... (0)2008/03/29
2008/07/27 22:37 2008/07/27 22:37
TAG Directive, OpenMP, 병렬, 병렬처리
받은 트랙백이 없고, 댓글이 없습니다.

트랙백 주소 :: http://www.filewiki.net/tc/trackback/97

댓글을 달아 주세요

◀ 이전페이지 1 다음페이지 ▶

블로그 이미지
First Sensation 귀차니스트
rss
  • 관리자
  • 글쓰기

카테고리

  • 전체 (111)
    • Computer (3)
    • Language (14)
    • Reverse Engineering (1)
    • Algorithm (9)
    • TopCoder (3)
    • Library (2)
    • Programming (20)
    • Programming Tip (9)
    • PSP-Programming (10)
    • Program (5)
    • Small Talk (31)
    • Document (4)

최근에 올라온 글

  • Gradient에 대한 정리.
  • Gradient 작성중에 있습.... (3)
  • 게임&인터랙티브 애플리....
  • 한게임 자동테트리스 Ve.... (27)
  • Intel 64 And IA32 Arch.... (2)

최근에 달린 댓글

  • 관리자만 볼 수 있는 댓글입.... 비밀방문자 01/08
  • 글쎄요.. 프로그램이라는게.... 귀차니스트 01/08
  • 관리자만 볼 수 있는 댓글입.... 비밀방문자 01/07
  • 본문에 배포는 하지 않는다고.... 귀차니스트 01/07
  • 다운어덯게 받아요. difl 2008

달력

«   2009/01   »
일 월 화 수 목 금 토
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

링크

  • kkamagui 프로그래밍 세상.
  • 류광의 번역 이야기.
  • 서광열의 프로그래밍 언....
  • 준호씨의 블로그.
  • 최익필의 이름없는 블로그.
  • 위키는 귀차니즘.

최근에 받은 트랙백

  • 궁극의 예외처리. 이름없는 블로그 2008
  • Maximum sum. 티스토리 지점 2008

글 보관함

  • 2009/01 (1)
  • 2008/12 (1)
  • 2008/11 (4)
  • 2008/10 (2)
  • 2008/09 (3)

태그목록

  • 참조
  • 쉘
  • Shell
  • Secure
  • Hilight
  • Event
  • spirit
  • Rest
  • Logitech
  • RLE8
  • 디코드
  • boost::Tokenizer
  • 유니코드
  • TTF
  • Ribbon UI
  • 난수
  • 1.35
  • Raw
  • Warcraft3
  • 파이널 데이터
  • ICPC
  • TopCoder
  • 오보에
  • TShell
  • ++i
  • OTF
  • HTML
  • 클라리넷
  • 관악기
  • std::auto_ptr

지역로그 : 태그 : 방명록 : 관리자 : 글쓰기
귀차니스트’s Blog is powered by Textcube 1.7.5 : Risoluto / Designed by DesignNia.net