1. Inner Product 개선
기존 코드
#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;
}
Reduction 활용 코드
#pragma omp parallel for reduction (+:sum)
for(i=0; i<N; i++)
sum+=a[i]*b[i];
a[i]*b[i]
을 계산하여 sum
으로 취합2. 내부 구조
스레드 내부
스레드 외부
reduction (+:sum)
-> 취합 연산 == '+'Reduction 연산자 (C)
1. 성능 비교 함수
omp_get_wtime
#include <omp.h>
...
double stime, etime;
...
stime=omp_get_wtime();
//Computing..
etime=omp_get_wtime()-stime;
printf("Elapsed Time: %lf sec.\n", etime);
2. Case 목록
Case 1: serial code
#define N 10000000
...
stime=omp_get_wtime();
for(i=0; i<N; i++)
sum+=a[i]*b[i];
etime=omp_get_wtime() - stime;
Case 2: critical
stime=omp_get_wtime();
#pragma omp parallel
{
#pragma omp for
for(i=0; i<N; i++)
#pragma omp critical
sum+=a[i]*b[i];
}
etime=omp_get_wtime() - stime;
Case 3: atomic(루프 내부)
stime=omp_get_wtime();
#pragma omp parallel
{
#pragma omp for
for(i=0; i<N; i++)
#pragma omp atomic
sum+=a[i]*b[i];
}
etime=omp_get_wtime() - stime;
Case 4: atomic(루프 외부)
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;
}
etime=omp_get_wtime() - stime;
Case 5: reduction
stime=omp_get_wtime();
#pragma omp parallel for reduction (+:sum)
for(i=0; i<N; i++)
sum+=a[i]*b[i];
3. Result
최고 성능
최저 성능
주의 사항