최근의 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의 시간이 소요 되었습니다.
댓글 없음:
댓글 쓰기