OpenMP Basic II - 루프 병렬화

GraGrass·2024년 1월 13일
0

Chapter 4

루프 병렬화

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을 따로 지정하지 않음
    -> i는 static (N를 스레드 개수로 나누어 할당)
  • 기본적으로 i는 각 스레드에서의 private var로 선언됨
  • OpenMP가 자동적으로 i= 0/5/10/15를 각 스레드에 선언

병렬 처리

  • Thread 0,1,2,3에서 각각 병렬적으로 for문 실행
  • 각 스레드의 출력 순서는 정해져 있지 않음

without #pragma omp for

  • for loop index i를 자동적으로 할당해주는 과정 X
  • 모든 스레드에서 N=20번의 iteration 수행

3. 작업 분배

스레드들 사이의 작업 분배

  • do/for, sections/section, single, task construct, etc.
  • cf) WORKSHARE clause in Fortan

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
  • 한 줄만 쓰면 됨 -> serial 코드에서 parallel로 전환하기 편리

Inner Product

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);
}

** 추후 수정 필요 (아직 덜 배움)

병렬 처리

  • 자동적으로 작업을 분배하여 수행
  • 각 스레드마다 계산이 완료된 값을 shared array c에 저장
  • 마지막에 array c의 모든 값을 더해 답을 냄
profile
올해는 진짜 갓생 산다

0개의 댓글