2016-04-18 26 views
1

Ich bin auf der Suche nach einer verzweigungslosen Möglichkeit, eine AVX2-Konstante basierend auf einer bestimmten Bedingung eines AVX2-Wertes zu wählen.Bedingt wählen Sie einen konstanten Wert mit AVX2

Pseudo-Code für das, was ich jetzt tue:

condition = _mm256_cmp_gt(value, limit); 
result = _mm256_or(_mm256_and(condition, constant_a), 
        _mm256_andnot(condition, constant_b)); 

Gibt es etwas effizienter als das?

+0

Try compiling '#include __m256 f (__ m256 x, __ m256 y, __ m256 z, __ m256 t) {zurück (x

Antwort

3

Sie können eine "Blend" -Anweisung verwenden, z. _mm256_blendv_epi8:

condition = _mm256_cmpgt_epi32(value, limit); 
result = _mm256_blendv_epi8 (constant_a, constant_b, condition); 

(. Man beachte, dass die _epi8 intrinsischen kann für jede Elementbreite verwendet werden, da sie von A und B auf einer Byte-für-Byte-Basis gemäß dem Maskeninhalt auswählt gerade)

+1

Große Lösung, viel prägnanter – user1043761