2013-03-06 22 views
7

の大きな配列の最大値を見つけるためにどのように私はSSE3組み込み関数を使用して、それをベクトル化しようとした最大値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; 
    } 
} 

を見つけるために、次のコードを持っているが、私は一種の上で打たしていますどのように私は比較を行う必要があります。

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

したがって、コードは浮動小数点数の固定長配列で最大の値を見つけます。 OK。

_mm_max_psがあります。これは、それぞれ4つの浮動小数点数の2つのベクトルからのペアワイズ最大値を示します。それではどうですか?

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

最後に、(そのためGetting max value in a __m128i vector with SSE?参照)maxで4つの値の最大つかみます。

それはこのように動作する必要があります

ステップ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でできない最悪のことがあるため、おそらく驚くことでしょう。 –

関連する問題