2013-03-06 1 views
7

У меня есть следующий код, чтобы найти максимальное значениеSSE3 встроенные функции: Как найти максимум большого массива поплавков

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; 
    } 
} 

Я попытался векторизации его с помощью SSE3 встроенных функций, но я вроде ударил по как я должен делать сравнение.

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 
} 

Может ли кто-нибудь дать представление об этом.

+1

Если мы посмотрим на код ДЕЙСТВИТЕЛЬНЫЕ смысл, мы видим, что это то же самое, что и http: //stackoverflow.c om/questions/9877700/get-max-value-in-a-m128i-vector-with-sse –

ответ

9

Таким образом, ваш код находит наибольшее значение в массиве с фиксированной длиной. ОК.

Существует _mm_max_ps, что дает вам попарные максимумы из двух векторов из четырех поплавков каждый. Так как насчет этого?

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); 
} 

Наконец, возьмите самый большой из четырех значений в max (см Getting max value in a __m128i vector with SSE? для этого).

Он должен работать так:

Шаг 1:

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

Шаг 2:

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

Шаг 2:

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

Добро пожаловать. Мне бы хотелось увидеть некоторые тесты, когда закончите. :) –

+0

Не должно быть: 'for (int i = 4; i

+0

@JohnZwinck * «Мне бы хотелось увидеть некоторые тесты, когда вы закончите» * - Вероятно, это будет плохой сюрприз, так как * неуправляемые * ходы - вот некоторые из худших вещей, которые вы можете сделать с SSE. –