Tôi đã gặp phải vấn đề tò mò. Một thuật toán tôi đang làm việc trên bao gồm rất nhiều tính toán như thế nàyHiệu suất dấu phẩy động 32 bit so với 64 bit
q = x(0)*y(0)*z(0) + x(1)*y(1)*z(1) + ...
nơi chiều dài của tổng là giữa 4 và 7.
Các tính toán ban đầu đều được thực hiện sử dụng chính xác 64-bit. Để thử nghiệm, tôi đã thử sử dụng độ chính xác 32 bit cho các giá trị đầu vào x, y, z (để tính toán được thực hiện bằng cách sử dụng 32 bit) và lưu trữ kết quả cuối cùng dưới dạng giá trị 64 bit (đúc đơn giản).
Tôi dự kiến hiệu suất 32 bit sẽ tốt hơn (kích thước bộ nhớ cache, kích thước SIMD, v.v.), nhưng với sự ngạc nhiên của tôi không có sự khác biệt về hiệu suất, thậm chí có thể giảm.
Kiến trúc được đề cập là Intel 64, Linux và GCC. Cả hai mã dường như sử dụng SSE và mảng trong cả hai trường hợp đều được căn chỉnh với ranh giới 16 byte.
Tại sao lại như vậy? Dự đoán của tôi cho đến nay là độ chính xác 32 bit chỉ có thể sử dụng SSE trên bốn phần tử đầu tiên, với phần còn lại được thực hiện một cách nghiêm túc bằng cách cast overhead.
Bạn đã thêm tiền thưởng - bạn không thích gì về câu trả lời của dsimcha? Nó cũng có thể là giá trị cố gắng GCC gần đây nhất bạn có thể hoặc trình biên dịch của Intel http://software.intel.com/en-us/articles/non-commercial-software-download/ để xem họ làm một công việc tốt hơn biên dịch/vectorising . – Rup
@Rup Tôi thích câu trả lời của anh ấy, tuy nhiên cũng thích các ý kiến khác, vì vậy tôi đặt một số tiền thưởng – Anycorn