본문 바로가기

프로그래밍/C++

[OpenMP] Windows 간단한 루프 병렬 처리

본인은 주로 JAVA 나 C#을 주로 쓴다.


실험을 위해서 프로그램을 JAVA로 만들었는데 JAVA는 멀티 쓰레드를 사용할 경우 JVM(Java Virtual Machine)에서 알아서 멀티코어를 활용한다.


하지만 실험 속도가 너무 느려서 성능 개선을 위해 C++로 다시 만들어야 했는데, C나 C++의 경우는 자원 공유 상황에 따라서 멀티코어를 잘 활용할 수도 있고, 활용을 잘 안할 수도 있다고 한다.


OpenMP


그래서 OpenMP 를 이용할것을 권장 하길래 간단하게 윈도우에서 OpenMP를 사용하는 방법을 기록하고자 한다. 

사용해보니 C++에서 thread를 사용하는 것 보다 매우 간편하다




1. 설정

OpenMP는 조건부 컴파일 지시자 #pragma 를 이용하기 때문에 혹여나 OpenMP를 지원하지 않는다고 해도 오류가 발생하지 않는다는 장점이 있다.


Visual Studio에서 OpenMP를 설치하지 않아도 지원하므로 따로 설치를 할 필요는 없다.


하지만 OpenMP 지원의 기본값이 사용 안함 이므로 OpenMP를 사용하도록 (프로젝트마다)설정을 해야 한다.


툴바에서 [프로젝트] -> [{프로젝트이름} 속성] -> [구성속성] -> [C/C++] -> [언어] -> [OpenMP 지원] 속성을 예 로 바꾸면 된다.




2. 사용법


아래는 OpenMP 를 이용해 2중 반복문을 병렬로 처리하고 수행 시간을 출력하는 예제이다.

#include <iostream>
#include <time.h>
void doNotihing()
{

}

void func(int n, int m)
{
	for (int i = 0; i < n ; i +=1)
	{
		for (int j = 0; j < m; j += 1)
		{
			doNotihing();
		}
	}
}

int main()
{
	clock_t start = clock();
	#pragma omp parallel for
	for (int i = 0; i < 4; i += 1)
	{
		func(100, 1000000);
	}
	std::cout << "run time = " << clock() - start << " milliseconds." << std::endl;
	return 0;
}



간단하게 for문 위에 아래의 문장을 작성하면 해당 반복문은 멀티 코어에서 작동한다.

#pragma omp parallel for

실행을 해서 테스트를 해 보면, 해당 라인이 있을 경우와 없는 경우에 수행 시간을 보면


본인의 PC(i3 4세대 2코어 4스레드) 에서 


병렬 처리를 활성화 한 경우



병렬 처리를 활성화 하지 않은 경우



성능이 확실히 상승한 것을 볼 수 있다



게다가 작업 관리자에서 CPU 사용량을 보면 모든 코어에 작업을 확실히 분배가 되었다.



3. 조건 (출처: 대릴 고브, 권오인 옮김, 100% 성능을 끌어내는 멀티코어 애플리케이션 프로그래밍 p314, 한빛미디어)

OpenMP로 루프를 병렬 처리 하는 것은 매우 간단하지만 몇 가지 조건이 만족되어야 한다. 런타임에 OpenMP가 루프의 시작과 끝이 언제인지 알 수 있어야 하기 때문이다.


1. for 루프만 병렬화 가능하고 형태는 다음과 같아야 한다 for( 초기화 ; 조건; 증감)

2. 조건문의 카운터 변수는 int, unsigned int, C 포인터, C++ iterator 만 가능

3. 조건문의 카운터 변수는 병렬화할 코드의 작 또는 끝 부분에서 초기화 되어야한다.

4. 루프 내 벼변수는 루프 조건문의 카운터와 함께 증가 또는 감소되어야 한다.

5. 루프 조건문은 루프 카운터 변수와 >, >=, <, <= 중 하나를 이용한 비교문이어야 한다.


이러한 조건이 만족되지 않더라도 컴파일, 또는 런타임에 오류가 발생하지는 않지만 병렬 처리가 되지 않는다.



4. 마무리

OpenMP를 이용하면 루프를 병렬화 하는 것은 매우 간단하다. 하지만 더 높은 성능을 끌어낼 수 있도록 몇 가지 옵션이 있는데, 그것은 다음 글에서 알아보자