1. 동기화
Synchronization
고 수준 동기화
저 수준 동기화
2. critical vs atomic
critical
atomic
1. critical
한 객체에 하나의 스레드
#pragma omp critical [크리티컬 객체 이름]
형식으로 지정 사용2. atomic
RW 동시 수행 작업
#pragma omp atomic
형식으로 지정 사용데이터 레이싱
3. barrier
스레드 체크포인트
Example
#include <stdio.h>
#include <omp.h>
int main()
{
int x=1;
omp_set_num_threads(4);
#pragma omp parallel shared(x)
{
x++;
#pragma omp barrier
printf("x= %d\n",x);
}
}
x++
수행할 때 까지 printf()
수행 Xx=5
가 출력될 것 1. C code
#include <stdio.h>
#include <omp.h>
#define N 10000
int main()
{
long int i, sum=0, local_sum=0;
int a[N], b[N];
double stime, etime;
for(i=0; i<N; i++){
a[i]=i+1;
b[i]=i+2;
}
stime=omp_get_wtime();
#pragma omp parallel private(local_sum)
{
local_sum=0;
#pragma omp for
for(i=0; i<N; i++)
local_sum+=a[i]*b[i];
#pragma omp atomic
sum+=local_sum;
}
// inner product for loop의 소요시간 = etime
etime=omp_get_wtime()-stime;
printf("sum= %ld\n", sum);
printf("Elapsed Time= %lf\n", etime);
}
local_sum
local_sum
사용local_sum
을 루프 병렬화를 통해 구함sum
sum
sum+=local_sum;
으로 각 스레드에서의 계산값을 취합2. Result
serial inner product
parallel inner product