firstprivate와 lastprivate는 OpenMP의 private 절과 어떻게 다릅니 까?
공식적인 정의를 살펴 보았지만 여전히 혼란 스럽습니다.
firstprivate
: 각 스레드가 변수의 고유 한 인스턴스를 가져야하며, 변수가 병렬 구성 전에 존재하기 때문에 변수의 값으로 초기화되어야 함을 지정합니다.
나에게 그것은 사적인 것처럼 들린다. 예제를 찾았지만 그것이 어떻게 특별하거나 어떻게 사용될 수 있는지 이해하지 못하는 것 같습니다.
lastprivate
: 변수의 둘러싸는 컨텍스트 버전이 최종 반복 (for-loop 구문) 또는 마지막 섹션 (#pragma 섹션)을 실행하는 스레드의 비공개 버전과 동일하게 설정되도록 지정합니다.
다음 예 때문에이 부분을 좀 더 잘 이해하고있는 것 같습니다.
#pragma omp parallel
{
#pragma omp for lastprivate(i)
for (i=0; i<n-1; i++)
a[i] = b[i] + b[i+1];
}
a[i]=b[i];
따라서이 예 lastprivate
에서는 for i
가 마지막 값으로 루프 외부에서 반환 될 수 있음을 이해합니다 .
저는 오늘 OpenMP를 배우기 시작했습니다.
private
변수는 초기화되지 않습니다. 즉, 다른 지역 자동 변수처럼 임의의 값으로 시작합니다 (그리고 종종 각 스레드의 스택에서 자동 변수를 사용하여 구현됩니다). 이 간단한 프로그램을 예로 들어 보겠습니다.
#include <stdio.h>
#include <omp.h>
int main (void)
{
int i = 10;
#pragma omp parallel private(i)
{
printf("thread %d: i = %d\n", omp_get_thread_num(), i);
i = 1000 + omp_get_thread_num();
}
printf("i = %d\n", i);
return 0;
}
4 개의 스레드를 사용하면 다음과 같은 결과가 출력됩니다.
thread 0: i = 0
thread 3: i = 32717
thread 1: i = 32717
thread 2: i = 1
i = 10
(another run of the same program)
thread 2: i = 1
thread 1: i = 1
thread 0: i = 0
thread 3: i = 32657
i = 10
이것은의 값이 i
병렬 영역 내에서 무작위 (초기화되지 않음)이고 병렬 영역 이후에 수정 사항이 보이지 않음 (즉, 변수가 영역에 들어가기 전의 값을 유지함)을 명확하게 보여줍니다 .
하면 i
된다 firstprivate
, 다음은 병렬 영역 앞에 있는지 값으로 초기화된다 :
thread 2: i = 10
thread 0: i = 10
thread 3: i = 10
thread 1: i = 10
i = 10
Still modifications to the value of i
inside the parallel region are not visible after it.
You already know about lastprivate
(and it is not applicable to the simple demonstration program as it lacks worksharing constructs).
So yes, firstprivate
and lastprivate
are just special cases of private
. The first one results in bringing in values from the outside context into the parallel region while the second one transfers values from the parallel region to the outside context. The rationale behind these data-sharing classes is that inside the parallel region all private variables shadow the ones from the outside context, i.e. it is not possible to use an assignment operation to modify the outside value of i
from inside the parallel region.
firstprivate
and lastprivate
are just special cases of private
.
The first one results in bringing in values from the outside context into the parallel region while the second one transfers values from the parallel region to the outside context.
'UFO ET IT' 카테고리의 다른 글
Qt : 종횡비를 유지하면서 QPixmap을 포함하는 QLabel 크기 조정 (0) | 2020.11.07 |
---|---|
중첩 된 파이썬 사전 및 목록에서 모든 키 발생 찾기 (0) | 2020.11.07 |
새로 고침과 플러시 (0) | 2020.11.07 |
기본값 유형이 속성 유형과 일치하지 않습니다. (0) | 2020.11.07 |
Rust의 관용적 콜백 (0) | 2020.11.07 |