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