我有一段大代码,其中的一部分包含以下代码:
result = (nx * m_Lx + ny * m_Ly + m_Lz) / sqrt(nx * nx + ny * ny + 1);
我已将其向量化,如下所示(所有内容均已转换为
float
):__m128 r = _mm_mul_ps(_mm_set_ps(ny, nx, ny, nx),
_mm_set_ps(ny, nx, m_Ly, m_Lx));
__declspec(align(16)) int asInt[4] = {
_mm_extract_ps(r,0), _mm_extract_ps(r,1),
_mm_extract_ps(r,2), _mm_extract_ps(r,3)
};
float (&res)[4] = reinterpret_cast<float (&)[4]>(asInt);
result = (res[0] + res[1] + m_Lz) / sqrt(res[2] + res[3] + 1);
结果是正确的,但是我的基准测试显示向量化版本更慢:
- 非向量化版本需要3750毫秒
- 向量化版本需要4050毫秒
- 直接将
result
设置为0
(并完全删除此部分代码)可以将整个过程缩短到2500毫秒
(我使用的是移动版Core i5。)