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

时间:2016-12-02 18:10:26

标签: 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);
    }
}

这也会发生在等同的类中,例如PointVect3

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

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

union f4vector
{
    v4sf v;
    float f[4];
};

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

  

指定使用__attribute__ ((mode))的矢量类型已弃用

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

0 个答案:

没有答案