출처 : http://www.filewiki.net/tc/entry/OpenMP-라고-아십니까
VS.net 2008에서 몇일 전 컴파일러 옵션에 대해서 이렇게 저렇게 조절을 하면서 저도 처음으로 OpenMP라는 옵션이 있다는 것을 알게되었습니다. 그냥 이름만 딱 봤을땐 Multi Process에 관련된 기능이라는 느낌이 오더군요. 예전에 C#에서 멀티 프로세싱에 관련된 어떠한 라이브러리에 대한 소개를 보았기 때문에 혹시 그런 종류가 아닐까 했습니다.
찾아보니 위에 언급한 라이브러리 부류더군요. 다만 다른 점은 Directive로 정의된다는 것일까요. 뭐 일단 OpenMP의 특징은 "공유 메모리를 사용하는 환경의 병렬화 프로그래밍의 표준"입니다. 고로 다른 플랫폼에서도 사용할 수 있습니다. 제가 찾아보니 리눅스에서도 가능하고, 썬 스튜디오 컴파일러에서도 가능하군요. 썬 스튜디오 컴파일러에서 된다면 x86서버 쪽일지라도 솔라리스에서 될지도 모르겠군요. 일단 Open그대로 여러가지 환경에서 사용될 수 있다는 것에 대해서는 무척 환영합니다. 사실 이런 기능이 하나, 둘 추가될 때마다 C++이란 언어가 괴물이 되어간다는 생각을 떨쳐버릴수가 없군요. 일단 간단한 예는 아래와 같더군요.
Directive로 이루어지다 보니 num_threads에 해당하는 Thread의 개수를 지정하여 아래의 블럭을 실행하는 쓰레드를 MAX개수 만큼 생성하여 해당 atomic에 대한 Multiple Write Protect를 수행하게 됩니다. 결국 수행하는 것만으로도 CPU에 대한 쓰레드 점유를 늘릴 수 있다는 거죠. 굳이 쓰레드를 여러가지 써가면서 작동하는 코드를 직접 써주지 않아도 된다는 말이됩니다.
물론 Thread 라는게 실질적으로 하나의 CPU에서 돌아갈 때는 Register에 자료를 저장한 다음, 다음에 수행해야 할 명령에 의하여 자료가 조작되기 때문에 돌아가는 속도가 빠를 수도 있기 때문에, 메모리에 액세스하여야 한다는 점을 유의하여 코드를 작성해야 합니다.
그리고 무조건 적인 Directive로만으로 이루어진 것은 아니더군요. 언어에 맞도록 lib를 통한 해당 헤더를 인클루드하게 되면 OpenMP에 해당하는 함수를 사용할 수도 있습니다.
결과는 MSDN에 존재하는 대로 1, 4, 1, 3, 1 그대로 나오더군요. 기본적으로 해당하는 Directive 명령어들과 연계가 되어 작동하는것 같군요. 뭐 결과를 보면 그렇게 말할 수 밖에 없겠습니다. #pragma pack(1)과 같이 기존 코드 생성에 해당하는 것을 변형시키는 지시자에 비하여, 실질적으로 생성되는 코드가 다르겠지만 사용자가 사용하는 프로그래머 측면에서는 결과를 모르게 사용할 수 있게 했다는 것에 대하여 큰 가산점을 주고 싶군요.
왠지 여러가지를 살펴보면서 얻는게 꽤 많은 것 같은데, 다들 유용하게 사용해보셨으면 좋겠군요^^;
VS.net 2008에서 몇일 전 컴파일러 옵션에 대해서 이렇게 저렇게 조절을 하면서 저도 처음으로 OpenMP라는 옵션이 있다는 것을 알게되었습니다. 그냥 이름만 딱 봤을땐 Multi Process에 관련된 기능이라는 느낌이 오더군요. 예전에 C#에서 멀티 프로세싱에 관련된 어떠한 라이브러리에 대한 소개를 보았기 때문에 혹시 그런 종류가 아닐까 했습니다.
찾아보니 위에 언급한 라이브러리 부류더군요. 다만 다른 점은 Directive로 정의된다는 것일까요. 뭐 일단 OpenMP의 특징은 "공유 메모리를 사용하는 환경의 병렬화 프로그래밍의 표준"입니다. 고로 다른 플랫폼에서도 사용할 수 있습니다. 제가 찾아보니 리눅스에서도 가능하고, 썬 스튜디오 컴파일러에서도 가능하군요. 썬 스튜디오 컴파일러에서 된다면 x86서버 쪽일지라도 솔라리스에서 될지도 모르겠군요. 일단 Open그대로 여러가지 환경에서 사용될 수 있다는 것에 대해서는 무척 환영합니다. 사실 이런 기능이 하나, 둘 추가될 때마다 C++이란 언어가 괴물이 되어간다는 생각을 떨쳐버릴수가 없군요. 일단 간단한 예는 아래와 같더군요.
Directive로 이루어지다 보니 num_threads에 해당하는 Thread의 개수를 지정하여 아래의 블럭을 실행하는 쓰레드를 MAX개수 만큼 생성하여 해당 atomic에 대한 Multiple Write Protect를 수행하게 됩니다. 결국 수행하는 것만으로도 CPU에 대한 쓰레드 점유를 늘릴 수 있다는 거죠. 굳이 쓰레드를 여러가지 써가면서 작동하는 코드를 직접 써주지 않아도 된다는 말이됩니다.
물론 Thread 라는게 실질적으로 하나의 CPU에서 돌아갈 때는 Register에 자료를 저장한 다음, 다음에 수행해야 할 명령에 의하여 자료가 조작되기 때문에 돌아가는 속도가 빠를 수도 있기 때문에, 메모리에 액세스하여야 한다는 점을 유의하여 코드를 작성해야 합니다.
그리고 무조건 적인 Directive로만으로 이루어진 것은 아니더군요. 언어에 맞도록 lib를 통한 해당 헤더를 인클루드하게 되면 OpenMP에 해당하는 함수를 사용할 수도 있습니다.
결과는 MSDN에 존재하는 대로 1, 4, 1, 3, 1 그대로 나오더군요. 기본적으로 해당하는 Directive 명령어들과 연계가 되어 작동하는것 같군요. 뭐 결과를 보면 그렇게 말할 수 밖에 없겠습니다. #pragma pack(1)과 같이 기존 코드 생성에 해당하는 것을 변형시키는 지시자에 비하여, 실질적으로 생성되는 코드가 다르겠지만 사용자가 사용하는 프로그래머 측면에서는 결과를 모르게 사용할 수 있게 했다는 것에 대하여 큰 가산점을 주고 싶군요.
왠지 여러가지를 살펴보면서 얻는게 꽤 많은 것 같은데, 다들 유용하게 사용해보셨으면 좋겠군요^^;
'Programing > C/C++/STL' 카테고리의 다른 글
[C/C++]메모리 영역 구분 (0) | 2009.08.27 |
---|---|
[C++] 멤버 함수포인터 사용하기 (0) | 2009.07.22 |
[C++] explicit 키워드 (0) | 2009.07.14 |
Source Code 수행속도 측정하는 방법 (0) | 2009.06.30 |
CppUnit CookBook (0) | 2009.04.29 |