私は現在、独自のC ++ベクトル数学ライブラリを作成しようとしていますが、SSEで最適化することに興味があります。私のvec2およびvec3データ型の場合、予想されるサイズである必要があるため、__ m128型を直接保存することはできませんが、vec4についてはどうでしょうか。私のvec4タイプが次のようになっていると仮定します(説明を簡単にするために16バイトのアライメント要件を無視します)。
union vec4 {
struct {float x, y, z, w;};
__m128 sse;
}
vec4 operator+(const vec4& left, const vec4& right) {
vec4 result;
result.sse = _mm_add_ps(left.sse, right.sse);
return result;
}
それはそれを行うための提案された方法ですか、それとも私が考えられない大きな理由がありますか?つまり、代わりにこれを行う必要があります:
struct vec4 {
float x, y, z, w;
};
vec4 operator+(const vec4& left, const vec4& right) {
__m128 leftSSE = _mm_load_ps(reinterpret_cast<const float*>(&left));
__m128 rightSSE = _mm_load_ps(reinterpret_cast<const float*>(&right));
__m128 resultSSE = _mm_add_ps(leftSSE, rightSSE);
vec4 result;
_mm_store_ps(reinterpret_cast<float*>(&result), resultSSE);
return result;
}
そして、私たちがそれに取り組んでいる間、私の理論上のvec2およびvec3タイプはどうですか?最初にそれらをvec4に変換してから、SIMD命令を使用するか、または単にそれらのスカラー要素を個別に処理する方が速いでしょうか?