>백엔드 개발 >C++ >OpenMP에서 배열 축소가 가능하며 어떻게 달성할 수 있습니까?

OpenMP에서 배열 축소가 가능하며 어떻게 달성할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-06 15:44:15799검색

Is Array Reduction Possible in OpenMP, and How Can It Be Achieved?

OpenMP의 배열 감소

문제:

프로그램을 병렬화하려면 배열 감소가 필요하지만 OpenMP에서는 불가능하다고 여겨집니다. 대안이 있습니까?

답변:

예, OpenMP에서는 배열 축소가 가능합니다. 두 가지 대체 방법은 다음과 같습니다.

방법 1: 중요 섹션을 사용한 비공개 합계 감소

  • 각 스레드에서 배열의 비공개 버전을 만듭니다.
  • 축소를 병렬로 수행합니다.
  • 정확한 값을 유지하기 위해 중요한 섹션의 값을 병합합니다. 결과.
int A [] = {84, 30, 95, 94, 36, 73, 52, 23, 2, 13};
int S [10] = {0};
#pragma omp parallel
{
    int S_private[10] = {0};
    #pragma omp for
    for (int n=0 ; n<10 ; ++n ) {
        for (int m=0; m<=n; ++m){
            S_private[n] += A[m];
        }
    }
    #pragma omp critical
    {
        for(int n=0; n<10; ++n) {
            S[n] += S_private[n];
        }
    }
}

방법 2: 중요 섹션 없이 비공개 합계 감소

  • [10 * nthreads] 차원의 비공개 배열을 만듭니다.
  • 축소를 병렬로 수행하고 결과를 비공개로 저장합니다.
  • 중요 섹션 없이 값을 원래 배열에 병합합니다.
int A [] = {84, 30, 95, 94, 36, 73, 52, 23, 2, 13};
int S [10] = {0};
int *S_private;
#pragma omp parallel
{
    const int nthreads = omp_get_num_threads();
    const int ithread = omp_get_thread_num();

    #pragma omp single 
    {
        S_private = new int[10*nthreads];
        for(int i=0; i<(10*nthreads); i++) S_private[i] = 0;
    }
    #pragma omp for
    for (int n=0 ; n<10 ; ++n )
    {
        for (int m=0; m<=n; ++m){
            S_private[ithread*10+n] += A[m];
        }
    }
    #pragma omp for
    for(int i=0; i<10; i++) {
        for(int t=0; t<nthreads; t++) {
            S[i] += S_private[10*t + i];
        }
    }
}
delete[] S_private;

위 내용은 OpenMP에서 배열 축소가 가능하며 어떻게 달성할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.