Heim >Backend-Entwicklung >C++ >Wie führt man Array-Reduktionen in OpenMP effizient durch?
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!