[C/C++] openMP를 통한 병렬처리 in VS

openMP는 기존 반목문에 특정 매크로를 명시하는 것으로 반복문의 구문을 각각의 스레드로 동작하게 할 수 있게 해주는 꽤나 특수한 라이브러리다.
이름은 Open Multi-Processing의 축약이다.

Visual Studio에서는 기본적으로 이 기능을 지원한다.
프로젝트 속성에 들어가서

구성 속성 -> C++ -> 언어 항목을 보면 OpenMP 지원이 있다. 여기서 예를 선택하면 openMP가 적용된다.

일단 OpenMP를 사용하지 않은 코드부터 봐보자.
단순하게 루프로 10번 출력하는 함수 foo를 루프로 5번 돌린다.

별다른 코드를 집어넣지 않았으니 당연히 순서대로만 작동한다. 0 다 출력하면 1 출력하고, 1 다 출력하면 2 출력하고...

그런데 저 for문 위에다가 특정 매크로 구문을 적용하면 달라지기 시작한다.
#prama omp parallel for

막 지멋대로 꼬여서 나온다. 저 5개의 foo 함수가 각자 별개의 스레드로 동작했기 때문이다.

보았듯 omp parallel for은 아래에 있는 for문을 병행 제어문으로 만들라는 뜻을 가진다.
그리고 pragma문으로 표현하기 때문에, openMP를 지원하지 않는 상황에서 컴파일한다면 그냥 일반 반복문의 형태로 정상 컴파일된다.

이런 매크로 외에도 이런저런 함수들이 있다.
omp_get_thread_num 함수는 현재 스레드의 ID를 알려준다.

0번 반복문은 0번 스레드.
1번/4번 반복문은 3번 스레드를 공유.
2번 반복문은 1번 스레드
3번 반복문은 2번 스레드에 할당된 것을 확인할 수 있다.
스레드를 얼마나 나눠서 어떻게 할당할지는 컴파일러가 알아서 정한다...

omp_set_num_threads 함수를 사용한다면 스레드 수를 직접 지정할 수 있다.

0번 함수(안보이지만) -> 0번 스레드
1번 함수 -> 1번 스레드
2번 함수 -> 2번 스레드
3번 함수 -> 3번 스레드
4번 함수 -> 4번 스레드

아까는 4개의 스레드를 5개의 함수가 나눠서 썼지만,
여기선 5개의 스레드를 할당했기 때문에 각자 하나씩 다 쓰는걸 볼 수 있다.

이외에도 omp_get_num_threads함수는 현재 생성된 스레드 개수를 반환하고,
omp_get_max_threads 함수는 최대 스레드 개수를 반환한다.


이거 말고도 동기화 등을 위한 다양한 매크로들이 정의되어있으나, 나중에 다루도록 하겠다.