OpenMP Basic I - 데이터 유효범위

GraGrass·2024년 1월 13일
0

Chapter 3

데이터 유효 범위

1. private

private(var1, var2, ...)

  • 지정된 변수를 스레드끼리 공유 방지
  • private 변수는 병렬 영역 내에서만 정의
  • 병렬 영역 밖에서 초기화 불가능
  • 병렬 영역이 끝나면 private 변수도 소멸

특징

  • 단순히 스레드로 메모리 영역 할당 -> 순차 영역의 오리지널 변수가 가지는 데이터 값을 전달 X
  • 스레드 영역에서 갱신된 값은 메인 영역 변수로 전달 X
  • 스레드 소멸 시 private 변수도 같이 소멸

고려사항

  • 병렬 영역 내에서 값을 할당 받는 변수

2. firstprivate & shared

firstprivate(var1, var2, ...)

  • private 변수처럼 각 스레드에 개별적으로 변수 생성
  • 각 스레드마다 순차영역에서 가져온 값으로 초기화
  • 스레드가 소멸될 때 로컬 변수의 값이 메인 영역으로 전달되지 않고 스레드와 함께 소멸
  • 사용 방법과 등작은 private와 동일

shared(var2, var2, ...)

  • Default
  • 변수 명에 지정된 변수를 스레드 팀의 모든 스레드가 공유

데이터 유효 범위의 사용법

1. Example: shared var

C code

#include <stdio.h>
#include <omp.h>

int main()
{
	int tid; // shared var
    omp_set_num_threads(32); // thread 개수 지정
#pragma omp parallel
{
	tid=omp_get_thread_num();
    printf("I am %d tid = %d\n", omp_get_thread_num(), tid);
}
}

Result

  • 예상: I am N tid = N 출력
  • 실제: tid와 omp_get_thread_num()불일치하는 상황 발생

shared var

  • tid는 shared var(Default)
  • 스레드가 모두 하나의 var을 공유 -> tid 출력은 그 시점에서 가장 최근의 스레드가 write한 값으로 나옴 -> 불일치!

2. Example: private var

C code

#include <stdio.h>
#include <omp.h>

int main()
{
	int tid; 
    omp_set_num_threads(4); // thread 개수 지정
#pragma omp parallel private(tid) // private var 
{
	tid=omp_get_thread_num();
    printf("I am %d tid = %d\n", omp_get_thread_num(), tid);
}
}

Result

  • I am N tid = N 출력
  • 여러번 돌려도 같은 결과

private var

  • 스레드 메모리에 각각 저장된 tid
  • 병렬 영역 내에서만 정의되며, 스레드 간 간섭 X

3. Example: firstprivate var

C code

#include <stdio.h>
#include <omp.h>

int main()
{
	int i=10, tid;
    omp_set_num_threads(4); // thread 개수 지정
// private var tid, firstprivate var i
#pragma omp parallel private(tid) firstprivate(i)
{
	tid=omp_get_thread_num();
    printf("tid=%d i=%d\n", tid, i);
    i = 20;
}
	printf("Tid=%d i=%d\n", tid, i);
}

Result

  • 병렬 영역에서 i는 모두 10으로 출력
  • 병렬 영역 이후 i도 모두 10으로 출력

private var

  • 병렬 영역을 시작하면서 모든 스레드의 i는 10으로 초기화
  • 병렬 영역이 끝난 후 firstprivate var i는 소멸
    -> 그래서 병렬 영역 내에서의 할당 i=20이 반영되지 않음!

스레드와 프로세스

1. 스레드와 프로세스

OpenMP: 스레드 기반

  • a.out 프로세스 단일 실행
  • 프로세스 내부에서 스레드가 여러 개 생성
  • 스레드는 프로세스의 하위 개념
    • 프로세스: 실행되고 있는 프로그램
    • 스레드: 프로세스 내의 실행 객체

MPI: 프로세스 기반

  • mpirun -np (프로세스 개수) a.out 으로 프로세스 개수 지정
  • Multiple Process, Multiple Threads

2. Example

C code

int main()
{
	int a,b,c,d;
    a=10; b=5; c=2; d=4;
    
#pragma omp parallel private(c,d) num_threads(2)
{
	c= a+10;
    d= b+5;
    a= a+1;
}
}

Result

  • a.out 프로세스에 스레드 두개 생성
  • 변수 a의 경우, 각 스레드의 실행 순서에 따라 12가 될 수도 11이 될 수도 있음
profile
올해는 진짜 갓생 산다

0개의 댓글