Maison > développement back-end > C++ > le corps du texte

Les instructions SIMD sur les processeurs Intel peuvent-elles améliorer considérablement les performances de l'algorithme de somme de préfixes ?

Patricia Arquette
Libérer: 2024-11-27 03:27:09
original
805 Les gens l'ont consulté

Can SIMD Instructions on Intel CPUs Significantly Improve Prefix Sum Algorithm Performance?

Somme des préfixes SIMD sur les processeurs Intel

Introduction

Les algorithmes de somme de préfixes trouvent la somme cumulée d'un tableau donné. Cette opération est rencontrée dans divers problèmes de calcul et nécessite des performances élevées pour un traitement efficace. Dans cet article, nous examinons si les instructions SIMD sur les processeurs Intel peuvent améliorer les performances d'un algorithme de somme de préfixes.

Somme de préfixes parallèle avec SIMD

Un algorithme de somme de préfixes parallèle consiste à effectuer des opérations en deux passes. Lors de la première passe, les sommes partielles sont calculées en parallèle, suivies de l'accumulation des sommes totales pour chaque somme partielle. Un deuxième passage ajoute la somme totale de chaque somme partielle à la suivante. L'utilisation de plusieurs threads via OpenMP pour le parallélisme et les instructions SIMD pour la deuxième passe peut améliorer l'efficacité.

Code pour la somme des préfixes SIMD

Voici un exemple du code pour le algorithme ci-dessus :

__m128 scan_SSE(__m128 x) {
    x = _mm_add_ps(x, _mm_castsi128_ps(_mm_slli_si128(_mm_castps_si128(x), 4)));
    x = _mm_add_ps(x, _mm_shuffle_ps(_mm_setzero_ps(), x, 0x40));
    return x;
}

void pass1_SSE(float *a, float *s, const int n) {
    __m128 offset = _mm_setzero_ps();
    #pragma omp for schedule(static) nowait
    for (int i = 0; i < n / 4; i++) {
        __m128 x = _mm_load_ps(&amp;a[4 * i]);
        __m128 out = scan_SSE(x);
        out = _mm_add_ps(out, offset);
        _mm_store_ps(&amp;s[4 * i], out);
        offset = _mm_shuffle_ps(out, out, _MM_SHUFFLE(3, 3, 3, 3));
    }
    float tmp[4];
    _mm_store_ps(tmp, offset);
    return tmp[3];
}

void pass2_SSE(float *s, __m128 offset, const int n) {
    #pragma omp for schedule(static)
    for (int i = 0; i<n/4; i++) {
        __m128 tmp1 = _mm_load_ps(&amp;s[4 * i]);
        tmp1 = _mm_add_ps(tmp1, offset);
        _mm_store_ps(&amp;s[4 * i], tmp1);
    }
}
Copier après la connexion

Discussion

Ces les optimisations permettent des améliorations significatives des performances pour les opérations de somme de préfixes sur de grands tableaux. L'utilisation de SIMD pour les deux passes améliore encore l'efficacité, réduisant ainsi le temps de calcul. Le code fourni utilise SIMD pour la deuxième passe et permet d'obtenir une amélioration des performances d'environ 7 fois sur un système quadricœur.

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