상세 컨텐츠

본문 제목

OpenMP #2 - Work Sharing

병렬처리/OpenMP

by cepiloth 2020. 1. 21. 16:35

본문

728x90
반응형

 

 

 

 전일 OpenMP 사용 시에 테스트했던 환경은 
Windows 10 Pro, Intel(r) Core(TM) i7-4790 CPU @ 3.60 GHz, Ram 8 GB, x64에서 테스트하였다.
Release 모드에서 결과가 의도했던 바와 다르게 속도가 느리게 나와서 의아함??

 멀티 코어를 쓰기 위해서 선행 작업인 함수 내의 종속성이 있는지 병렬화가 가능 한지 먼저 판단하고 CORE를 쓰기 위한 로직을 작성해야 하지만 어제의 코드는 컴파일러 최적화에 의해 의미 없는 코드를 테스트하게 되어 스레드를 추가할 때마다 오히려 비용이 커지게 되어 의도하지 않는 문제가 나타났다. 어제 사용한 방식은 work-sharing 모델이었다.

 

Work-Sharing

같은 작업을 스레드 별로 실행하는 것이 아니라 작업을 분할해서 스레드 별로 나누어서 실행하는 것을 말한다.

#pragma omp parallel for        // for문을 병렬로 수행하기 위한 directive

 바로 뒤에 오는 for 루프의 반복 실행을 스레드에 분배한다. 그리고 루프 끝에 암시적 장벽(동기화)이 존재한다. 이를 피하려면 nowait 사용하면 된다. 데이터 병렬화시에 활용된다.

 

수정된 코드

#include <iostream>
#include <windows.h>
#include <omp.h>      // OpenMP 에 대한 함수가 정의된 헤더파일
#include <ctime>
using namespace std;

#define COUNT_MAX 100000000

char table[COUNT_MAX] = { 0, };

int main()
{
    clock_t start = clock();

    int max_count = omp_get_max_threads(); // 사용 가능한 최대 스레드 개수 리턴 

    cout << "max threads count : " << max_count << "\n";
    cout << "using threads count : " << 4 << "\n";
    omp_set_num_threads(4);         // for문을 병렬로 수행할 때 사용할 Thread 갯수

#pragma omp parallel for        // for문을 병렬로 수행하기 위한 directive
    for (int i = 0; i < COUNT_MAX; i += 1)
    {
        table[i] = i;
    }

    cout << "run time = " << clock() - start << " milliseconds." << std::endl;
    system("pause");
    return 0;
}

 

결과

 

omp_set_num_threads(1); // 1 thread 사용
omp_set_num_threads(2); // 2 thread 사용
 
omp_set_num_threads(3); // 3 thread 사용

 

omp_set_num_threads(4); // 4 thread 사용

 

무조건 OpenMP를 사용해서 병렬화를 하는 것이 아니라 병렬화를 할 수 있는 코드를 먼저 작성해야 한다. 데이터의 의존성, 종속성을 먼저 확인하고 적용하도록 하자.

728x90
반응형

'병렬처리 > OpenMP' 카테고리의 다른 글

OpenMP #5 - android configration  (0) 2020.01.21
OpenMP #4 - xcode configration  (0) 2020.01.21
OpenMP #3 - omp parallel for 디렉티브  (0) 2020.01.21
OpenMP #1 - 환경 설정  (0) 2020.01.21

관련글 더보기

댓글 영역