2012-04-15 6 views
2

私はインライン・プログラムを使用して私のプログラムを最適化しています。しかし、今では、結果を浮動小数点値と比較するために、__m128ベクトルにある4つの要素を合計したいと考えています。たとえば、私はこの128ビットのベクトルを持っているとしましょう:{a、b c、d}。 + b + c + dとeをどのように比較できますか?eはfloat型です。_m128ベクトルの4つの32ビット要素の合計

SSE2またはSSE3は、これを簡単に行う方法を提供していますか、または私を助けるコードスニペットがありますか?ありがとう!

+0

2つのHADDPSでSSE3で実行できますが、それほど高速ではありません。このベクターはどこから来たのですか?水平方向の加算を避けることができるように計算するものは何でも構いませんか? – harold

+0

私は(a * a + b * b)と4.0を比較しなければなりません。これを行うために、vec = {a、b、UNUSED、UNUSED}などの__m128ベクタにaとbを格納しました。 square = _mm_mul_ps(vec、vec)を実行して{a²、b²、X、X}を取得します。そして今、私は²+b²を得る方法を探していますので、それを4.0と比較することができます。 それは確かに最適ではないので、アドバイスがあれば、それは非常に高く評価されるでしょう:) – Merkil

+0

SSE4は許可されていますか? – harold

答えて

1

私がアップでできる最善のはこれです:

; assumes xmm0 = [0, B, 0, A] or similar 
mulps xmm0,xmm0 ; [0, B*B, 0, A*A] 
xorps xmm1,xmm1 
movhlps xmm1,xmm0 ; [0, 0, 0, B * B] 
addps xmm0,xmm1 ; [0, 0, 0, A * A + B * B] 

AとBは絶対その後、限り、私はあなたが事前に遅いシャッフルし、必要に言うことができるように下位クワッドワードにする必要がある場合Penryn(そしてPenrynではDPPSソリューションが利用可能です)。

+0

ありがとうございました。しかし、今私はこのベクトルを持っている、それを4と比較する方法は? {0、0、0、4}を含むベクトルを作成し、それらを_mm_cmpeq_ssと比較する必要がありますか? – Merkil

+1

必要ならば、これは浮動小数点なので、実際にはEQバリアントとうまく混合されません。何のために?比較をLEまたはNLTの代替品に置き換えることはできますか? – harold

+0

実際、LEを使うこともできます。ご協力いただきありがとうございます ! – Merkil

関連する問題