我目前正在尝试制作自己的 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 指令还是单独处理它们的标量元素会更快吗?