>백엔드 개발 >C++ >OpenMP에서 배열 축소를 효율적으로 수행하는 방법은 무엇입니까?

OpenMP에서 배열 축소를 효율적으로 수행하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-03 09:07:121057검색

How to Efficiently Perform Array Reductions in OpenMP?

OpenMP에서 배열 감소 해결

OpenMP에서는 배열을 직접 줄이는 것은 지원되지 않습니다. 그러나 유사한 결과를 얻기 위한 대체 방법이 존재합니다.

첫 번째 방법:

한 가지 접근 방식은 각 스레드에 대한 배열의 전용 복사본을 생성하고 이를 로컬로 줄이는 것입니다. 병렬 섹션 이후 데이터 경합을 방지하기 위해 중요한 섹션을 사용하여 개인 어레이를 원래 어레이에 병합합니다.

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];
        }
    }
}

두 번째 방법:

또 다른 방법은 다음과 같습니다. 배열 크기에 스레드 수를 곱한 크기와 동일한 크기의 더 큰 배열을 할당합니다. 그런 다음 각 스레드는 배열의 해당 부분을 채웁니다. 병렬 섹션 이후에는 임계 섹션을 사용하지 않고 값을 원래 배열로 병합합니다.

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];
        }
    }
}

두 번째 방법은 특히 다중 소켓과 관련된 시나리오에서 더 효율적이지만 이를 방지하려면 신중한 메모리 처리가 필요합니다. 캐시 문제.

위 내용은 OpenMP에서 배열 축소를 효율적으로 수행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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