본문 바로가기

개발자/Programming

[OpenMP] 옵션 가장 많이 쓰이는 두 가지

반응형

OpenMP에서 thread관리등 필수 옵션들입니다.

실제로는 이것뿐만 아니라 atomic/private/task등등 여러 옵션들이 지원됩니다.

 

1. Loop scheduling

OpenMP의 Loop scheduling이 운영체제의 scheduling을 제어하는 것은 아닙니다. 단지 OpenMP가 관장하는 Thread들이 좀 더 효과적으로 작업을 처리할 수 있도록 scheduling 방법을 제어하는 정도의 수준입니다. 

-그냥 for 문에 적용한 경우

#pragma omp for 만 추가하면 된다

-schedule 옵션(루프가 병렬로 실행하는 방식을 지정)

 

  • STATIC : 모든 스레드가 공평한 개수의 묶음을 실행
  • DYNAMIC : 먼저 끝난 스레드가 다음 묶음을 실행

 

  • 묶음 (Chunk)
    • 스레드가 한번에 실행할 루프의 횟수
  • "nowait" 스레드의 실행을 동기화 하지 않음
    • 먼저 끝난 스레드가 다른 스레드의 작업종료를 기다리지 않고 다음 작업 실행

 

 

보통 병렬로 for문을 처리하게 되면 작업량에 상관없이 각 스레드에 작업량을 등분하게 되어 비효율적일 수 있다.

schedule은 각 스레드 별로 루프 실행의 작업량을 분배할 수 있는 방법.

기본적인 schedule 정책 : 실행 횟수 균등 분배

#pragma omp for schedule(dynamic)

 

2. num_threads 옵션

omp_set_num_threads() 뒤따르는 parallel region에서 사용할 thread의 개수를 지정함

#include <omp.h>
int _tmain(int argc, _TCHAR* argv[])
{
    omp_set_num_threads(4);

    clock_t startTime = clock();
    #pragma omp parallel 
    {
        int threadCount = omp_get_num_threads();
        #pragma omp for schedule(static)
        for (int i = 0 ; i < threadCount * 5 ; i++)
        {
            Sleep(i * 100);            
            _tprintf(_T("Thread Num: %d, counter = %i\n"), omp_get_thread_num(), i);
        }
        _tprintf(_T("Thread Num: %d, Finished\n"), omp_get_thread_num());
    }
    _tprintf(_T("Elpase Time: %d\n"), clock() - startTime);
}

3. 그외 옵션 wait, atomi, reduce, SIMD, private, sum

 

반응형