1. 작업 분할 지시어
개요
종류
2. 동기화
구문의 시작점
구문의 끝점
1. Sections
정의
#pragma omp sections
로 정의사용
#pragma omp sections
로 작업을 나눔Example - C code
#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;
}
}
for (i=0; i<10; i++)
printf("%d ",a[i]);
printf("\n");
for (i=0; i<20; i++)
printf("%d ",b[i]);
printf("\n");
}
Example - 결과 및 해석
2. Single
정의
#pragma omp single
로 정의사용
Example - C code
#include <stdio.h>
#include <omp.h>
int main()
{
omp_set_num_threads(32);
#pragma omp parallel
{
#pragma omp single
{
printf("hello world\n");
}
}
}
Example - 결과 및 해석
3. Master
정의
#pragma omp master
section을 마스터 스레드(0번)에서만 실행4. 정리
1. Nowait
정의
사용
Example 1 - C code
#include <stdio.h>
#include <omp.h>
int main()
{
int x=1;
omp_set_num_threads(16);
#pragma omp parallel
{
#pragma omp single nowait
{
x++;
printf("x=%d\n", x);
}
#pragma omp single
{
x++;
printf("x=%d\n", x);
}
}
return 0;
}
Example 1 - 결과 및 해석
#pragma omp single nowait
로 인해 묵시적 barrier가 없어짐Example 2 - C code
#include <stdio.h>
#include <omp.h>
#define N 10000
int main()
{
int i, j , a[N][N];
omp_set_num_threads(4);
#pragma omp parallel private(i,j)
{
// 행렬의 위쪽 삼각형 초기화
#pragma omp for nowait
for (i=0; i<N; i++)
for (j=i; j<N; j++)
a[i][j] = i+j;
// 행렬의 아래쪽 삼각형 초기화
#pragma omp for
for (i=0; i<N; i++)
for (j=0; j<i; j++)
a[i][j] = i-j;
}
}
Example 2 - 결과 및 해석
2. Ordered
정의
ordered
section 내부의 루프 실행을 순차적으로 진행ordered
clause를 가져야 함ordered
section을 실행하는 스레드는 매 순간 한개Example - C code
#include <stdio.h>
#include <omp.h>
#define N 10000
int main()
{
int i, a[5];
omp_set_num_threads(4);
#pragma omp parallel private(i)
{
#pragma omp for ordered
for (i=0; i<5; i++)
{
a[i]=i*2; // 병렬 처리 (순서 X)
#pragma omp ordered
printf("a[%d] = %d\n",i,a[i]); // 순차 처리
}
}
}
Example - 결과 및 해석
a[0] = 0
a[1] = 2
a[2] = 4
a[3] = 6
a[4] = 8
a[i]=i*2;
구문은 순서 상관없이 병렬적으로 처리됨printf("a[%d] = %d\n",i,a[i]);
구문은 앞의 스레드들이 모두 작업이 마칠 때 까지 뒤의 스레드들이 대기