UFO ET IT

firstprivate와 lastprivate는 OpenMP의 private 절과 어떻게 다릅니 까?

ufoet 2020. 11. 7. 18:15
반응형

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.

참고URL : https://stackoverflow.com/questions/15304760/how-are-firstprivate-and-lastprivate-different-than-private-clauses-in-openmp

반응형