2017-09-08 7 views
0

J'ai trouvé la solution suivante pour _m128itrouver float maximale dans le vecteur sse M128

int horizontal_max_Vec4i(__m128i x) { 
    __m128i max1 = _mm_shuffle_epi32(x, _MM_SHUFFLE(0,0,3,2)); 
    __m128i max2 = _mm_max_epi32(x,max1); 
    __m128i max3 = _mm_shuffle_epi32(max2, _MM_SHUFFLE(0,0,0,1)); 
    __m128i max4 = _mm_max_epi32(max2,max3); 
    return _mm_cvtsi128_si32(max4); 
} 

Quelle serait la fonction équivalente qui retourne le flotteur maximale d'un M128?

(je peux utiliser une version de SSE et AVX)

apprécierait toute aide

Répondre

3

En utilisant votre algorithme, vous pouvez simplement le traduire dans les versions en virgule flottante de taille unique des valeurs intrinsèques. Ne dit pas qu'il est la solution la plus optimale, mais quelque chose comme ceci:

float horizontal_max_Vec4(__m128 x) { 
    __m128 max1 = _mm_shuffle_ps(x, x, _MM_SHUFFLE(0,0,3,2)); 
    __m128 max2 = _mm_max_ps(x, max1); 
    __m128 max3 = _mm_shuffle_ps(max2, max2, _MM_SHUFFLE(0,0,0,1)); 
    __m128 max4 = _mm_max_ps(max2, max3); 
    float result = _mm_cvtss_f32(max4); 
    return result; 
} 
+0

Cela me donne l'air stupide xD Juste commencé avec ceux intrinsèques et complètement raté qu'il y a le _mm_store1_ps. Merci: P – CheckersGuy

+2

Larsson et @CheckersGuy: vous ne voulez pas stocker en mémoire. Utilisez 'return _mm_cvtss_f32 (max4)'. (Astuce pour la recherche [guide intrinsèques d'Intel] (https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=float%20_mm): 'float _mm' trouvera les intrinsèques' _mm * 'qui retournent' float'). Si vous êtes malchanceux, votre compilateur compilera cela dans un * real * store/reload. (Et vous n'avez pas besoin d'aligner 'result' si vous n'utilisez que' movss' (store1), pas un magasin de 16 octets.) –

+1

De plus, si vous n'avez pas AVX, vous pouvez enregistrer des MOVAPS instructions avec un choix judicieux de shuffles si les compilateurs n'optimisent pas cela pour vous. Surtout si vous avez SSE3. Horizontal MAX a besoin des mêmes shuffles que l'ADD horizontal, voir https://stackoverflow.com/questions/6996764/fastest-way-to-do-horizontal-float-vector-sum-on-x86. –

0

Vous pouvez utiliser DirectXMath, MS a tout fait pour vous sur _m128.