__m128に格納されている最大絶対値を持つ値の符号を知る必要があります。これは私が今持っている解決策です:
int getMaxSign(__m128 const& vec) {
static const __m128 SIGN_BIT_MASK =
_mm_castsi128_ps(_mm_set1_epi32(0x80000000));
// This creates an int, where sign(a) is 1 if a is negative, 0 o.w.:
// sign(a3)<<3 | sign(a2)<<2 | sign(a1)<<1 | sign(a0)
const int signMask = _mm_movemask_ps(vec);
// Get the absolute value of the vector;
__m128 absValsMMX = _mm_andnot_ps(SIGN_BIT_MASK, vec);
// Figure out the horizontal max
__declspec(align(16)) float absVals[4];
_mm_store_ps(absVals, absValsMMX);
const float maxVal = std::max(std::max(absVals[0], absVals[1]), absVals[2]);
return (maxVal == absVals[0] ? signMask & 0x1 :
(maxVal == absVals[1] ? signMask & 0x2 : signMask & 0x4));
}
この場合、最大絶対値の値が負の場合は符号が1になり、それ以外の場合は0になりますが、実際には規則が何であるかは気にしません。もう1つは、これらの__m128を使用して同種のベクトルを表現しているため、最後の値が常に0になることを知っています。
これは、比較的単純なタスクのために行うべき多くの作業のようです。どうすればこれをより速く行うことができますか?
ありがとう!