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
Libérer: 2024-12-04 07:00:12
original
691 Les gens l'ont consulté

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];
        }
    }
}
Copier après la connexion

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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal