728x90
작업 분할지시어
-do/for : 전체 스래드들에게 일을 분담하여 맡김. 노는 스래드 x
-sections : 스레드 하나씩에게 일 할당. 나머지 스레드는 대기
-single : 하나의 스레드에게만 일시킴. 나머지는 대기
-workshare : fortran 명령어
section
- 스레드 하나에게 작업을 할당해주는 구문
- 모든 section이 종료될때까지 대기함
- 문제점 : 스레드가 10개가 존재하는데, section이 2개뿐이라면 -> 8개는 쉬고 있음
section 예제
#include <stdio.h>
#include <omp.h>
int main()
{
int i, a[10], b[20];
omp_set_num_threads(2);
#pragma omp parallel private(i)
{
#pragma omp sections
{
#pragma omp section
for(i=0; i<10; i++)
a[i] = i*10+5;
#pragma omp section
for(i=0; i<20; i++)
b[i] = i*5+10;
}
} // pragma omp parallel private(i)
for(i=0; i<10; i++)
printf("%d ", a[i]);
printf("\n");
for(i=0; i<20; i++)
printf("%d ", b[i]);
printf("\n");
}
single
- 하나의 스레드만 들어와서 작업
- 먼저 도착하는 스레드가 일함
- 다른 스레드는 싱글에 도착한 스레드가 작업 끝날때까지 대기(베리어)
single 예제
#include <stdio.h>
#include <omp.h>
int main()
{
omp_set_num_threads(4);
#pragma omp parallel
{
#pragma omp single
{
printf("hello world\n");
}
} // pragma omp parallel
}
master
- single이랑 동일함
- 마스터 스래드에서만 실행함
- 다른 스레드들은 싱글과 달리 베리어가 없어 넘어감
master 예제
#include <stdio.h>
#include <omp.h>
int main()
{
omp_set_num_threads(4);
#pragma omp parallel
{
#pragma omp master
{
sleep(1);
printf("hello world\n");
}
printf("tid = %d\n", omp_get_thread_num());
} // pragma omp parallel
}
300x250
'컴퓨터과학 > 기타' 카테고리의 다른 글
openmp - 22. ordered, lock (0) | 2020.07.30 |
---|---|
openmp - 21. nowait (0) | 2020.07.30 |
openmp - 19. 중첩 스레드 (0) | 2020.07.30 |
openmp - 18. 병렬 블록, 포크 조인, 동기화 문제 (0) | 2020.07.30 |
openmp - 17. pi계산에서의 병렬화를 통한 성능 개선 (0) | 2020.07.29 |