繁体   English   中英

启用arch:SSE2使程序变慢

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM