使用g ++在C++中使用SIMD指令的现代方法

mjg*_*ndo 6 c++ gcc simd

我正在构建一个光线跟踪器,在很多情况下我需要在三个浮点数上进行加法和乘法运算.

在这种情况下,我一直在以天真的方式做到这一点:

class Color{
    float mR, mG, mB;

    ...
    Color operator+(const Color &color) const
    {
        return Color(mR + color.mR,
                     mG + color.mG,
                     mB + color.mB);
    }

    Color operator*(const Color &color) const
    {
        return Color(mR * color.mR / COLOR_MAX,
                     mG * color.mG / COLOR_MAX,
                     mB * color.mB / COLOR_MAX);
    }
}
Run Code Online (Sandbox Code Playgroud)

这也会发生在等价的类中,如PointVect3.

然后我听说了SIMD指令,它们看起来非常适合我正在做的事情.所以,当然,我用Google搜索并找到了这段代码:

typedef int v4sf __attribute__((mode(V4SF))); // Vector of three single floats

union f4vector
{
    v4sf v;
    float f[4];
};
Run Code Online (Sandbox Code Playgroud)

首先使用额外的四个我现在不需要.但是gcc警告我:

__attribute__ ((mode))不推荐使用指定向量类型

我想知道如何在C++ 14中做到这一点(如果它甚至完全不同),我似乎无法找到任何其他方法.