Tôi có một mảnh lớn của mã, một phần của mà cơ thể có chứa đoạn mã này:SSE chậm hơn FPU?
result = (nx * m_Lx + ny * m_Ly + m_Lz)/sqrt(nx * nx + ny * ny + 1);
mà tôi đã vector hóa như sau (tất cả mọi thứ đã là một 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);
Kết quả đúng; Tuy nhiên, điểm chuẩn của tôi cho thấy rằng phiên bản vectorized là chậm:
- Phiên bản phi vectorized mất 3750 ms
- Phiên bản vectorized mất 4050 ms
- Thiết
result
-0
trực tiếp (và loại bỏ phần này của mã hoàn toàn) làm giảm toàn bộ quá trình đến 2500 ms
cho rằng các phiên bản vectorized chỉ chứa một tập hợp các phép nhân SSE (thay vì bốn phép nhân FPU), tại sao nó chậm hơn? FPU có thực sự nhanh hơn SSE không, hoặc có một biến nhiễu ở đây không?
(Tôi đang trên một Core i5 di động.)
Đã một thời gian kể từ khi tôi nhìn thấy câu hỏi SSE trên SO. Tôi đoán mọi người đang trở về từ kỳ nghỉ.:) – Mysticial
@Mysticial: LOL. xD – Mehrdad