我遇到了一个奇怪的问题。我工作的一种算法是由大量的计算这样32位与64位浮点性能
q = x(0)*y(0)*z(0) + x(1)*y(1)*z(1) + ...
其中总和的长度为4和7
之间
原来的计算都使用64位精度完成的。对于实验,我尝试对x,y,z输入值使用32位精度(以便计算使用32位执行),并将最终结果存储为64位值(直接转换)。我希望32位性能更好(缓存大小, SIMD大小等),但令我惊讶的是,性能没有差别,甚至可能会减少。有问题的架构是Intel 64,Linux和GCC。两个代码似乎都使用SSE,并且这两种情况下的数组都对齐到16字节的边界。
为什么会这样?到目前为止,我的猜测是32位精度只能在前四个元素上使用SSE,其余的都是通过施放开销连续进行的。
您已添加赏金 - 您对dsimcha的回答有什么不喜欢的?也许值得尝试一下最新的GCC或英特尔的编译器http://software.intel.com/en-us/articles/non-commercial-software-download/,看看他们是否做得更好,编译/矢量化。 – Rup 2010-07-06 16:56:16
@Rup我喜欢他的回答,但也希望其他意见,所以我把一个赏金 – Anycorn 2010-07-06 19:12:21