c++ - SSE 添加比 + 运算符慢

标签 c++ x86 sse simd

我试图测试添加 SSE 的速度有多快,但有些地方不对。我在堆栈中为输入创建了两个数组,为输出创建了一个数组,并以两种方式对它们执行加法。它比常规 + 运算符慢。我在这里做错了什么:

#include <iostream>
#include <nmmintrin.h>
#include <chrono>

using namespace std;

#define USE_SSE

typedef chrono::steady_clock::time_point TimeStamp;
typedef chrono::steady_clock Clock;
int main()
{
    const int MAX = 100000 * 4;
    float in1[MAX];
    float in2[MAX];
    float out[MAX];

    memset(out,0,sizeof(float) * MAX);

    for(int i = 0 ; i < MAX ; ++i)
    {
        in1[i] = 1.0f;
        in2[i] = 1.0f;
    }

    TimeStamp start,end;
    start = Clock::now();

    for(int i = 0 ; i < MAX ; i+=4)
    {
#ifdef USE_SSE

        __m128 a = _mm_load_ps(&in1[i]);
        __m128 b = _mm_load_ps(&in2[i]);
        __m128 result = _mm_add_ps(a,b);
        _mm_store_ps(&out[i],result);
#else
        out[0] = in1[0] + in2[0];
        out[1] = in1[1] + in2[1];
        out[2] = in1[2] + in2[2];
        out[3] = in1[3] + in2[3];
#endif
    }


    end = Clock::now();
    double dt = chrono::duration_cast<chrono::nanoseconds>(end-start).count();
    cout<<dt<<endl;

    return 0;
}

这里是内存对齐问题吗?

最佳答案

你的代码中有一个错误,非 SSE 部分应该读作:

    out[i+0] = in1[i+0] + in2[i+0];
    out[i+1] = in1[i+1] + in2[i+1];
    out[i+2] = in1[i+2] + in2[i+2];
    out[i+3] = in1[i+3] + in2[i+3];

您应该考虑让您的基准运行时间更长一些,因为测量短时间段是不可靠的。也许,您需要采取一些措施来防止编译器优化您的代码(例如将 out 标记为 volatile)。始终检查汇编代码,以确保您测量的是什么。

关于c++ - SSE 添加比 + 运算符慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53312711/

相关文章:

performance - AVX mat4 inv 实现比 SSE 慢

c++ - 使用或不使用指针制作数据成员对象

c++ - 重载 = 运算符,使用具有字符串指针的结构

assembly - 双缓冲,汇编 x86

assembly - 在引导扇区中使用 INT 0x10 打印字符串

c++ - SSE整数除法?

c++ - "using function-name"只能隐藏普通功能?

c++ - 隐式转换没有警告

c - 刷新写入内存 Controller 的缓冲区到 DDR 设备

c - 我怎样才能让 GCC 用 SSE 指令向量化这个简单的复制循环?