Heim > Backend-Entwicklung > C++ > Wie kann die Array-Reduktion in OpenMP parallelisiert werden?

Wie kann die Array-Reduktion in OpenMP parallelisiert werden?

Susan Sarandon
Freigeben: 2024-12-07 03:13:10
Original
891 Leute haben es durchsucht

How Can Array Reduction be Parallelized in OpenMP?

Reduzieren auf einem Array in OpenMP

Es ist nicht möglich, eine Reduzierung direkt auf einem Array in OpenMP durchzuführen. Es gibt jedoch alternative Ansätze, um Parallelität zur Array-Reduktion zu erreichen.

Erste Methode: Private Arrays und kritischer Abschnitt

Diese Methode erstellt private Kopien des Arrays für jeden Thread. Jeder Thread füllt sein privates Array aus, und ein kritischer Abschnitt wird verwendet, um die Ergebnisse im endgültigen Array zusammenzuführen.

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];
        }
    }
}
Nach dem Login kopieren

Zweite Methode: Array-Erweiterung und Thread-unabhängige Akkumulation

Diese Methode erstellt ein erweitertes Array, das alle Threads umfasst. Jeder Thread füllt seinen Teil des Arrays aus, und dann werden die Ergebnisse zusammengeführt, ohne einen kritischen Abschnitt zu verwenden. Dieser Ansatz kann zu Cache-Problemen führen, wenn er auf Multi-Socket-Systemen nicht sorgfältig angewendet wird.

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;
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann die Array-Reduktion in OpenMP parallelisiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage