2013-03-06 9 views
7

ho il seguente codice per trovare il valore massimointrinseci SSE3: Come trovare il massimo di una vasta gamma di carri

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

Ho provato vettorizzazione esso utilizzando intrinseci SSE3, ma sto tipo di colpito su come dovrei fare il confronto.

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 
} 

Qualcuno può darci qualche idea.

+1

Se guardiamo il codice del reale nel senso, vediamo che è lo stesso di http: //stackoverflow.c om/questions/9877700/getting-max-value-in-a-m128i-vector-with-sse –

risposta

9

Così il tuo codice trova il valore più grande in una serie di float a lunghezza fissa. OK.

C'è _mm_max_ps, che fornisce i massimi pairwise da due vettori di quattro float ciascuno. Che ne dici di questo?

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

Infine, afferrare il più grande dei quattro valori in max (vedi Getting max value in a __m128i vector with SSE? per questo).

Dovrebbe funzionare in questo modo:

Fase 1:

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

Fase 2:

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

Fase 2:

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

Prego. Mi piacerebbe vedere alcuni benchmark quando hai finito. :) –

+0

Non dovrebbe essere: 'for (int i = 4; i

+0

@JohnZwinck * "Mi piacerebbe vedere alcuni benchmark quando hai finito" * - Sarà probabilmente una brutta sorpresa, poiché le mosse * non allineate * sono alcune delle peggiori cose che puoi fare con SSE. –

Problemi correlati