【发布时间】:2012-02-09 11:18:16
【问题描述】:
我有一大段代码,它的部分主体包含这段代码:
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 ms
鉴于矢量化版本仅包含 一个 组 SSE 乘法(而不是四个单独的 FPU 乘法),为什么它更慢? FPU 确实比 SSE 快,还是这里有一个混淆变量?
(我使用的是移动 Core i5。)
【问题讨论】:
-
我已经有一段时间没有看到关于 SO 的 SSE 问题了。我想每个人都从假期回来。 :)
标签: c++ optimization sse vectorization simd