[英]Enabling arch:SSE2 makes program slower
在Visual Studio 2010上,当我在以下代码上启用增强指令集时,实际上会增加执行时间。
void add(float * input1, float * input2, float * output, int size)
{
for(int iter = 0; iter < size; iter++)
{
output[iter] = input1[iter] * input2[iter];
}
}
int main()
{
const int SIZE = 10000000;
float *in1 = new float[SIZE];
float *in2 = new float[SIZE];
float *out = new float[SIZE];
for(int iter = 0; iter < SIZE; iter++)
{
in1[iter] = std::rand();
in2[iter] = std::rand();
out[iter] = std::rand();
}
clock_t start = clock();
for(int iter = 0; iter < 100; iter++)
{
add(in1, in2, out, SIZE);
}
clock_t end = clock();
double time = difftime(end,start)/(double)CLOCKS_PER_SEC;
system("PAUSE");
return 0;
}
对于启用了SSE2的time
变量,我一直在大约2.0
秒,但是当它“未设置”时大约需要1.7
秒。 我正在构建Windows 7 64位,VS 2010专业版,发布配置,优化速度。
是否有任何解释为什么启用SSE导致更长的执行时间?
SSE代码中存在一个开销,用于将值移入和移出SSE寄存器,如果您只进行非常简单的计算(例如您的示例),则可能超过SSE的性能优势。
另请注意,如果数据不是16字节对齐,则此开销会显着增大。
IMO,依靠编译器进行这些优化通常不是一个好主意。 你的代码应该运行得更快(除非编译器已经为你做了,但似乎并非如此)。 我建议
1确保您的阵列对齐16byte
2在内联添加功能中使用SSE内在函数:
#include <xmmintrin.h>
inline void add(const float * input1, const float * input2, float * output, int size)
{
// assuming here that
// - all 3 arrays are 16-byte aligned
// - size is a multiple of 4
for(int iter = 0; iter < size; iter += 4)
_mm_store_ps( output+iter, _mm_mul_ps( _mm_load_ps(input1+iter),
_mm_load_ps(input2+iter) ) );
}
如果这不会产生更快的代码,那么加载和存储确实会为单个乘法运算带来太多开销。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.