2013-07-14 10 views
5

Załóżmy, że zmienna __m128 ma 4 wartości SP, a chcesz minimalną, czy jest dostępna jakaś funkcja wewnętrzna lub coś innego niż naiwne liniowe porównanie wartości?Minimum 4 wartości SP w __m128

prawo znać moje rozwiązanie jest następujące (załóżmy zmienna wejściowa __m128 jest x):

x = _mm_min_ps(x, (__m128)_mm_srli_si128((__m128i)x, 4)); 
min = _mm_min_ss(x, (__m128)_mm_srli_si128((__m128i)x, 8))[0]; 

który jest dość straszne, ale to działa (btw, czy istnieje coś takiego jak _mm_srli_si128 ale dla typu __m128?)

Odpowiedz

5

nie ma jednej instrukcji/wewnętrzną, ale można to zrobić z dwóch Shuffle i dwóch minut:

__m128 _mm_hmin_ps(__m128 v) 
{ 
    v = _mm_min_ps(v, _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 1, 0, 3))); 
    v = _mm_min_ps(v, _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 0, 3, 2))); 
    return v; 
} 

Wektor wyjściowy będzie zawierał min wszystkich elementów wektora wejściowego, replikowanych w wektorze wyjściowym.

+0

jesteś pewien, że to prawda? Przetestowałem z tym wektorem wejściowym (od 'v [0]' do 'v [3]') '0.109375 0.096875 0.093750 0.096875' i jest to wynik:' 0.096875 0.096875 0.093750 0.093750'. Co masz na myśli przez replikację? –

+0

Przepraszam - Zniszczyłem stałe permutacji - zostało to naprawione i przetestowane. Wektor wyjściowy ma wszystkie 4 elementy równe minowi elementu wektora wejściowego. –

Powiązane problemy