아래 C++빌더 관련 논의 중에
종종 OpenMP란 용어가 나오는데
잠시 찾아보니 멀티프로세서 지원하는 기능이라는것은 알겠는데
주로 어느 분야에 어떤 용도로 많이 쓰시나요?
잠깐 생각나는 것은 멀티 코어 CPU나 멀티 프로세서 기반에서
CPU 자원을 100% 가까이 엄청나게 사용해야 하는 계산(무슨계산일까..? )에 사용하면 빠르긴 할것 같은데
기존 멀티쓰레드 프로그래밍과의 차이도 애매하고요
구체적 예를 들어서.. 경험자 분께서 깔끔하게 필요성을 정리 좀 해주셨으면 합니다.~
|
예를들어 for 최적화라면 그저 단순이 for 위에 #pragma 절 한줄 적어주는 것 만으로도 최적화(병렬화)가 가능합니다.
또하나의 장점이라면 #pragma 절을 이용 하기 때문에, OpenMP 를 지원하지 않는 컴파일러에서도 병렬화를 무시하고 바이너리를 만들어 낼 수 있다는겁니다.
예를들겠습니다.
1부터 1억까지 루프를 돌면서 합을 계산 하는 작업이 있다고 칩시다. 이 코드를 4코어에 최적화 하려면
1~ 2500만 - 1,
2500만 ~ 5000만 -1,
5000만~7500만 -1,
7500만~ 1억
이런식으로 4개의 함수로 분리한 후 4개를 별도의 Thread 에 할당해서 계산을 시키고 메인 Thread 에서는 Wait하는 것이 일반적으로 계산을 최적화 하는 방법입니다(거기 (1 + 1억) * 5천만 하신분은 좀 자제를 ㅡ.ㅡ)
그런데 OpenMP를 사용하면 1~1억의 단일 루프를 내부적 으로 4개의 루프로 분리해서 Thread 로 나누는 작업 역시 가능하고(For 최적화) 명시적으로 4개의 부분으로 나눈 뒤 그것을 병렬처리하도록 하는것(Section 최적화) 도 가능합니다.
즉 시스템을 건드리지 않고, CreateThreadEx 같은 플랫폼 의존적인 코드를 사용 하지 않고도 OpenMP 를 지원하는 컴파일러만 사용한다면 간단히 최적화 할 수 있다는 겁니다.
또하나의 장점은 같은 병렬화 도구인 TBB와 달리 부가적인 코드가 전혀 없다는겁니다.
(TBB의 경우 템플릿으로 이루어져있어 최적화 외의 작업에 들어가는 오버헤드가 큽니다)
제 경우는 512 * 512 이미지를 512 개 프로세싱 해야 되는 곳에서 OpenMP 를 사용해서 간단하게 큰 효과를 본 경험이 있습니다.