Heim >Backend-Entwicklung >C++ >Wie führt man Array-Reduktionen in OpenMP effizient durch?

Wie führt man Array-Reduktionen in OpenMP effizient durch?

Susan Sarandon
Susan SarandonOriginal
2024-12-03 09:07:121008Durchsuche

How to Efficiently Perform Array Reductions in OpenMP?

Array-Reduktionen in OpenMP lösen

In OpenMP wird die direkte Reduzierung auf Arrays nicht unterstützt. Es gibt jedoch alternative Methoden, um ähnliche Ergebnisse zu erzielen.

Erste Methode:

Ein Ansatz besteht darin, private Kopien des Arrays für jeden Thread zu erstellen und diese lokal zu reduzieren. Führen Sie nach dem parallelen Abschnitt die privaten Arrays mithilfe eines kritischen Abschnitts mit dem ursprünglichen Array zusammen, um Datenwettläufe zu verhindern.

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

Zweite Methode:

Eine andere Möglichkeit besteht darin Weisen Sie ein größeres Array mit Abmessungen zu, die der Array-Größe multipliziert mit der Anzahl der Threads entsprechen. Jeder Thread füllt dann seinen Teil des Arrays. Führen Sie nach dem parallelen Abschnitt die Werte in das ursprüngliche Array ein, ohne einen kritischen Abschnitt zu verwenden.

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

Die zweite Methode ist effizienter, insbesondere in Szenarien mit mehreren Sockets, erfordert jedoch auch eine sorgfältige Speicherbehandlung, um dies zu vermeiden Cache-Probleme.

Das obige ist der detaillierte Inhalt vonWie führt man Array-Reduktionen in OpenMP effizient durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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