1. C code
#include <stdio.h>
#include <omp.h>
#define N 20
int main()
{
int tid, i;
omp_set_num_threads(4);
#pragma omp parallel private(tid)
{
tid=omp_get_thread_num();
#pragma omp for
for (i=0; i<N; i++)
printf("Hello World %d %d\n", tid, i);
}
}
2. Result
for loop index i
#pragma omp for
에서 schedule을 따로 지정하지 않음병렬 처리
without #pragma omp for
3. 작업 분배
스레드들 사이의 작업 분배
OpenMP shortcut
#pragma omp parallel for
for (i=0; i<N; i++)
printf("Hello World %d %d\n",i);
#pragma omp parallel
+ #pragma omp for
1. Serial
#include <stdio.h>
#include <omp.h>
#define N 10000
int main()
{
long int tid,i, 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();
for(i=0; i<N; i++)
sum+=a[i]*b[i];
// inner product for loop의 소요시간 = etime
etime=omp_get_wtime()-stime;
printf("sum= %ld\n", sum);
printf("Elapsed Time= %lf\n", etime);
}
2. Parallel
C code
#include <stdio.h>
#include <omp.h>
#define N 10000
int main()
{
long int tid,i, sum=0;
int a[N], b[N];
long int c[4]; // 각 스레드의 결과값 저장
double stime, etime;
for(i=0; i<N; i++){
a[i]=i+1;
b[i]=i+2;
}
omp_set_num_threads(4);
stime=omp_get_wtime();
#pragma omp parallel private(tid)
{
tid=omp_get_thread_num();
c[tid]=0;
#pragma omp for
for(i=0; i<N; i++)
c[tid]+=a[i]*b[i];
}
for(i=0; i<4; i++)
sum += c[i]; // 계산값 취합
// inner product for loop의 소요시간 = etime
etime=omp_get_wtime()-stime;
printf("sum= %ld\n", sum);
printf("Elapsed Time= %lf\n", etime);
}
** 추후 수정 필요 (아직 덜 배움)
병렬 처리