>백엔드 개발 >C++ >OpenMP에서 배열 축소를 어떻게 병렬화할 수 있습니까?

OpenMP에서 배열 축소를 어떻게 병렬화할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-07 03:13:10887검색

How Can Array Reduction be Parallelized in OpenMP?

OpenMP에서 배열 축소

OpenMP에서는 배열 축소를 직접 수행할 수 없습니다. 그러나 배열 축소 병렬 처리를 달성하기 위한 대체 접근 방식이 있습니다.

첫 번째 방법: 전용 배열 및 중요 섹션

이 방법은 각 스레드에 대한 배열의 전용 복사본을 생성합니다. 각 스레드는 자체 배열을 채우고 임계 섹션은 결과를 최종 배열로 병합하는 데 사용됩니다.

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

두 번째 방법: 배열 확장 및 스레드 독립적 누적

이 방법은 모든 스레드에 걸쳐 확장된 배열을 생성합니다. 각 스레드는 배열의 해당 부분을 채운 다음 임계 섹션을 사용하지 않고 결과를 병합합니다. 이 접근 방식은 다중 소켓 시스템에서 주의 깊게 사용하지 않으면 캐시 문제가 발생할 수 있습니다.

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으로 문의하세요.