2013-03-06 14 views
7

Mam następujący kod, aby znaleźć maksymalną wartośćSSE3 intrinsics: Jak znaleźć maksymalnie dużej tablicy pływaków

int length = 2000; 
float *data; 
// data is allocated and initialized 

float max = 0.0; 
for(int i = 0; i < length; i++) 
{ 
    if(data[i] > max) 
    { 
     max = data; 
    } 
} 

Próbowałem Wektoryzacja go za pomocą SSE3 intrinsics, ale ja niby uderzony jak powinienem dokonać porównania.

int length = 2000; 
float *data; 
// data is allocated and initialized 

float max = 0.0; 
// for time being just assume that length is always mod 4 
for(int i = 0; i < length; i+=4) 
{ 
    __m128 a = _mm_loadu_ps(data[i]); 
    __m128 b = _mm_load1_ps(max); 

    __m128 gt = _mm_cmpgt_ps(a,b); 

    // Kinda of struck on what to do next 
} 

Czy ktoś może dać jakiś pomysł na ten temat.

+1

Jeśli spojrzymy na Kodeks Rzeczywisty co oznacza, że ​​jest taki sam jak http: //stackoverflow.c om/questions/9877700/get-max-value-in-a-m128i-vector-with-sse –

Odpowiedz

9

Więc kod znajdzie największą wartość w tablicy stałej długości pływaków. OK.

Jest _mm_max_ps, który daje parami maksima z dwóch wektorów czterech pływaków każdy. A co powiesz na to?

int length = 2000; 
float *data; // maybe you should just use the SSE type here to avoid copying later 
// data is allocated and initialized 

// for time being just assume that length is always mod 4 
__m128 max = _mm_loadu_ps(data); // load the first 4 
for(int i = 4; i < length; i+=4) 
{ 
    __m128 cur = _mm_loadu_ps(data + i); 
    max = _mm_max_ps(max, cur); 
} 

Wreszcie chwycić największą z czterech wartości w max (patrz Getting max value in a __m128i vector with SSE? do tego).

To powinno działać w ten sposób:

Krok 1:

[43, 29, 58, 94] (this is max) 
[82, 83, 10, 88] 
[19, 39, 85, 77] 

Krok 2:

[82, 83, 58, 94] (this is max) 
[19, 39, 85, 77] 

Krok 2:

[82, 83, 85, 94] (this is max) 
+0

Nie ma za co. Po zakończeniu chciałabym zobaczyć testy porównawcze. :) –

+0

Nie powinno to być: 'for (int i = 4; i

+0

@JohnZwinck * "Chciałbym zobaczyć kilka benchmarków, gdy skończysz" * - Prawdopodobnie będzie to zła niespodzianka, ponieważ * niewyrównane * ruchy to jedne z najgorszych rzeczy, które możesz zrobić z SSE. –

Powiązane problemy