반응형
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
반응형
'개발자 > Programming' 카테고리의 다른 글
VSCODE 꿀팁 북마크 사용하기 (0) | 2021.03.08 |
---|---|
[CUDA] GPGPU 그리고 CUDA 프로그래밍 기초 (0) | 2020.10.02 |
OpenMP 지시어(Directive) (0) | 2020.08.28 |
OpenMP 멀티 쓰레드 구현, 시작 (0) | 2020.08.28 |
비쥬얼 스튜디오 코드 필수 익스텐션 10개 추천 (0) | 2020.06.23 |