상세 컨텐츠

본문 제목

OpenMP #1 - 환경 설정

병렬처리/OpenMP

by cepiloth 2020. 1. 21. 16:29

본문

728x90
반응형

OpenMP를 사용하면 쉽게 병렬 처리를 할 수 있다.

먼저 환경 구성은 프로젝트 속성창 - C/C++ - 언어 탭으로 이동하여 OpenMP 지원을 선택한다.

 

코드

아래는 OpenMP 를 사용하여 병렬 처리를 하는 예제 코드 이다.

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

#define COUNT_MAX 1000

void doNothing()
{

}

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

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

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

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

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

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

 

 

결론

Release OpenMP 사용 OpenMP 미 사용
속도 측정 3 ms 2 ms

무엇이 잘못된 것인가??

 

  1. OpenMP 를 사용 시에 무조건 향상된다고 생각했던 것이 문제였다. 소프트웨어 엔지니어는 HW 엔지니어와 다르게 하드웨어 단에 L2, L1 Cache 동작을 생각하지 않는다. 실제 명령어 fetch, execute 등 명령어 동작 파이프라인을 생각해야 한다. 
  2. 본 예제에 가장 큰 잘못된 점은 멀티코어로 인한 성능을 온전히 활용하기 위핸 코드 패턴으로 테스트하지 않았다.
    • 데이터의 종속성, 의존성 분리 등 공유메모리 모델, 메시지 전달 모델(생산자-소비자 패턴) 등 코어를 활용하여 성능을 내는 적절한 코드가 아니라는 것.
  3. 이외에도 동기화 처리를 못하거나 section, task 등 OpenMP에서 제공하는 지시어를 멀티코어를 활용할 수 있는 코드 패턴으로 작성하지 않으면 의도하지 못한 문제가 발생한다. (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 #2 - Work Sharing  (0) 2020.01.21

관련글 더보기

댓글 영역