A.25 copyprivate 데이터 특성 절 예제
예제 1: 는 copyprivate 절 (2.7.2.8 섹션 32 페이지에) 브로드캐스트 단일 스레드가 직접 다른 스레드는 개인 변수의 모든 인스턴스를 통해 얻은 값을 사용할 수 있습니다.
float x, y;
#pragma omp threadprivate(x, y)
void init( )
{
float a;
float b;
#pragma omp single copyprivate(a,b,x,y)
{
get_values(a,b,x,y);
}
use_values(a, b, x, y);
}
일상적인 경우 init 라고 하면 직렬 영역에서 동작의 지시문의 존재가 영향을 받습니다. 호출 하면 해당 get_values 루틴 한 스레드에 의해 실행 된, 스레드 구문 지정 개인 개체까지 나갈 는, b, x, 및 y 모든 스레드를 읽은 값으로 정의 될.
예제 2: 이전 예제와 달리 읽기 마스터 스레드 예를 들어 특정 스레드에 의해 수행 해야 한다고 가정 합니다. 이 경우에 copyprivate 절 직접 브로드캐스트에 사용할 수 없습니다 있지만 임시 공유 객체 액세스를 사용할 수 있습니다.
float read_next( )
{
float * tmp;
float return_val;
#pragma omp single copyprivate(tmp)
{
tmp = (float *) malloc(sizeof(float));
}
#pragma omp master
{
get_float( tmp );
}
#pragma omp barrier
return_val = *tmp;
#pragma omp barrier
#pragma omp single
{
free(tmp);
}
return return_val;
}
예제 3: 입력 하기 전에 병렬 영역 내부에서는 필요한 잠금 개체 수를 쉽게 확인할 수 있다는 가정 합니다. copyprivate 절을 사용 하 여 액세스 해당 병렬 영역 내부에 할당 된 공유 잠금 개체를 제공할 수 있습니다.
#include <omp.h>
omp_lock_t *new_lock()
{
omp_lock_t *lock_ptr;
#pragma omp single copyprivate(lock_ptr)
{
lock_ptr = (omp_lock_t *) malloc(sizeof(omp_lock_t));
omp_init_lock( lock_ptr );
}
return lock_ptr;
}