Post List

2014년 12월 29일 월요일

Visual C++에서 OpenMP를 이용한 병렬처리

최근의 CPU는 멀티 코어로 연산 하는 것이 주류가 되고 있습니다. 멀티 스레드로 연산하기 위해서 OpneMP로 병렬처리를 구현합니다.

OpenMP의 장점은 OpenMP가 유효하지 않은 환경에서 코멘트와 같게 무시되는 지시문(OpenMP의 경우는 「#pragma omp」)을 이용하여 동일한 프로그램을 사용할 수 있는 점입니다.
또, Visual C++ 2008 이후에 간단하게 이용할 수 있습니다.

사용설정은 프로젝트 속성 → C/C++ → 언어 → OpenMP 지원 : yes로 지정하고
코드에 #include <omp.h>를 추가합니다.



2~1000000 의 소수의 수를 세는 프로그램에서 병렬처리의 유용성을 확인해 보겠습니다.


Visual C++ + OpenMP의 프로그램

#include <iostream>
#include <time.h>
#include <omp.h>

using namespace std;

bool prime(int n);

int N = 100000;

int main() {
    clock_t  time_start, time_end;
    time_start = clock();

#ifdef _OPENMP
    //omp_set_num_threads(8);
    cout << "OpenMP 이용하는(최대 스레드 수:" << omp_get_max_threads() << ")" << endl;
#endif

    int NN = 0;
#pragma omp parallel
    {
#pragma omp for //schedule(dynamic, 100)
       for (int n = 2; n <= N; ++n) {
           if (prime(n)) {
#pragma omp critical
              NN++;
           }
       }
    }
    time_end = clock();

    cout << "2부터" << N << "까지 소수의 개수는 " << NN << "입니" << endl;
    cout << "계산시간은 " << double(time_end - time_start) / double(CLOCKS_PER_SEC) << "입니다" << endl;
    cin.get();//입력 대기
    return 0;
}

bool prime(int n) {
    bool flag = true;
    for (int i = 2; i<n; i++) {
       if (n%i == 0) {
           flag = false;
           break;
       }
    }
    return flag;
}

프로그램 안의 「#pragma omp parallel」는 다음에 나오는 코드를 배타적 연산합니다.

실행 결과
OpenMP를 이용하여 병렬처를 했을 경우와 통상의 경우를 비교 한 결과는 다음과 같습니다.

OpneMP 를 이용했을 경우
OpenMP를 이용합니다(최대 스레드 수:8)
2부터 1000000까지의 소수의 개수는 78498입니다
계산시간은 43.514입니다 

OpneMP 를 이용하지 않는 경우
2부터 1000000까지의 소수의 개수는 78498입니다
계산시간은 143.828입니다

계산시간은 약 1/3의 시간이 소요 되었습니다.
성능향상을 확인 할 수 있습니다

원문 : GoParallel.egloos.com/1973620

댓글 없음:

댓글 쓰기