Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Pengurangan Tatasusunan Boleh Dicapai dalam OpenMP Apabila Ia Tidak Disokong Secara Langsung?
Mengurangkan Tatasusunan dalam OpenMP
OpenMP menyediakan keupayaan pelaksanaan selari untuk pelbagai aplikasi. Walau bagaimanapun, persoalan biasa timbul mengenai pengurangan tatasusunan, yang tidak disokong secara langsung oleh OpenMP.
Penyelesaian Alternatif
Walaupun pengurangan tatasusunan asli tidak tersedia, terdapat kaedah alternatif untuk mencapai kefungsian serupa dalam C/C :
Kaedah 1: Pengurangan Tatasusunan Peribadi dengan Kritikal Bahagian
Dalam pendekatan ini, setiap urutan beroperasi pada salinan peribadi tatasusunan, mengumpul sumbangannya. Apabila semua urutan telah selesai, bahagian kritikal digunakan untuk menggabungkan elemen tatasusunan individu ke dalam tatasusunan asal.
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]; } } }
Kaedah 2: Pengurangan Tatasusunan Benang-Setempat
Kaedah ini menghapuskan bahagian kritikal dengan mencipta tatasusunan perantaraan dengan dimensi 10*benang. Benang mengisi tatasusunan ini secara selari dan kemudian menggabungkannya ke dalam tatasusunan asal.
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;
Pendekatan ini mengatasi kekurangan pengurangan tatasusunan asli dalam OpenMP, membolehkan pengumpulan elemen tatasusunan yang cekap secara selari.
Atas ialah kandungan terperinci Bagaimanakah Pengurangan Tatasusunan Boleh Dicapai dalam OpenMP Apabila Ia Tidak Disokong Secara Langsung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!