Maison >développement back-end >C++ >La réduction de tableau est-elle possible dans OpenMP et comment y parvenir ?

La réduction de tableau est-elle possible dans OpenMP et comment y parvenir ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-06 15:44:15799parcourir

Is Array Reduction Possible in OpenMP, and How Can It Be Achieved?

Réduction de tableau dans OpenMP

Problème :

La parallélisation d'un programme nécessite une réduction de tableau mais cela est considéré comme impossible dans OpenMP. Existe-t-il une alternative ?

Réponse :

Oui, la réduction de tableau est possible dans OpenMP. Voici deux méthodes alternatives :

Méthode 1 : réduction de la somme privée avec section critique

  • Créez des versions privées du tableau dans chaque thread.
  • Effectuer les réductions en parallèle.
  • Fusionner les valeurs dans une section critique pour conserver les valeurs correctes résultats.
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];
        }
    }
}

Méthode 2 : réduction de la somme privée sans section critique

  • Créez un tableau privé avec des dimensions [10 * nthreads].
  • Effectuer les réductions en parallèle et stocker les résultats dans le privé tableau.
  • Fusionnez les valeurs dans le tableau d'origine sans section critique.
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;

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