Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Pengurangan Tatasusunan Boleh Dicapai dalam OpenMP Apabila Ia Tidak Disokong Secara Langsung?

Bagaimanakah Pengurangan Tatasusunan Boleh Dicapai dalam OpenMP Apabila Ia Tidak Disokong Secara Langsung?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-04 07:00:12633semak imbas

How Can Array Reduction Be Achieved in OpenMP When It's Not Directly Supported?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn