Maison >développement back-end >C++ >Comment obtenir une réduction de tableau dans OpenMP lorsqu'il n'est pas directement pris en charge ?

Comment obtenir une réduction de tableau dans OpenMP lorsqu'il n'est pas directement pris en charge ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-04 07:00:12633parcourir

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

Réduction sur les tableaux dans OpenMP

OpenMP offre des capacités d'exécution parallèle pour une vaste gamme d'applications. Cependant, une question courante se pose concernant la réduction de tableau, qui n'est pas directement prise en charge par OpenMP.

Solution alternative

Bien que la réduction de tableau native ne soit pas disponible, il existe des méthodes alternatives pour obtenir une fonctionnalité similaire en C/C :

Méthode 1 : réduction des tableaux privés avec critique Section

Dans cette approche, chaque thread opère sur une copie privée du tableau, accumulant ses contributions. Lorsque tous les threads sont terminés, une section critique est utilisée pour fusionner les éléments individuels du tableau dans le tableau d'origine.

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

Méthode 2 : réduction du tableau local par thread

Cette méthode élimine la section critique en créant un tableau intermédiaire de dimensions 10*nthreads. Les threads remplissent ce tableau en parallèle, puis le fusionnent dans le tableau d'origine.

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;

Ces approches pallient au manque de réduction native du tableau dans OpenMP, permettant une accumulation efficace d'éléments du tableau en parallèle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn