Maison > Article > développement back-end > Les instructions SIMD sur les processeurs Intel peuvent-elles améliorer considérablement les performances de l'algorithme de somme de préfixes ?
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(&a[4 * i]); __m128 out = scan_SSE(x); out = _mm_add_ps(out, offset); _mm_store_ps(&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(&s[4 * i]); tmp1 = _mm_add_ps(tmp1, offset); _mm_store_ps(&s[4 * i], tmp1); } }
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!