【问题标题】:Switch SSE intrinsics using templates使用模板切换 SSE 内在函数
【发布时间】:2013-07-22 15:14:48
【问题描述】:

我使用模板专业化方式来切换浮点/双 SSE-intrinsics:

template<typename Precision>
struct simd
{
    typedef Precision simd_vector;
};

template<>
struct simd<float>
{
    typedef __m128 simd_vector;
};

template<>
struct simd<double>
{
    typedef __m128d simd_vector;
};

int main()
{
    simd<float>::simd_vector float_vector;//__m128
    simd<double>::simd_vector double_vector;//__m128d
}

效果很好,但我不明白如何以同样的方式使用 SSE 内在函数?假设我们想要切换加法操作:_mm_add_ps 内在 - 用于浮点数,_mm_add_pd 用于双精度数。我该如何使用模板专业化技巧?

【问题讨论】:

  • 这是Precision 不是Presision! :)

标签: c++ metaprogramming sse simd


【解决方案1】:

由于您可能需要为您可以想象的每个操作生成一条线,因此您也可以实现适当的运算符:

template<>
struct simd<double>
{
    typedef __m128d simd_vector;
};

simd<float>::simd_vector operator+(simd<float>::simd_vector a, simd<float>::simd_vector b)
{
    return _mm_add_ps(a, b);
}

等等。

【讨论】:

    【解决方案2】:

    您可以做的是用适当的函数专门化每个类,这些函数调用它们的适当函数。

    template<>
    struct simd<float>
    {
        typedef __m128 simd_vector;
        simd_vector v;
    
        simd operator+(const simd& _s){
           //call my simd function for floats to operator on v
        }
    };
    
    template<>
    struct simd<double>
    {
        typedef __m128d simd_vector;
        simd_vector v;
    
        simd operator+(const simd& _s){
            //call my simd function for doubles to operate on v
        }
    };
    

    以及如何使用它是:

    simd<float> sf1, sf2;
    simd<float> sf3 = sf1+sf2;
    //get vector throw sd3.v;
    simd<double> sd1, sd2;
    simd<double> sd3 = sd1 + sd2;
    //get vector through sd3.v;
    

    当然需要适当初始化sf1、sf2、sd1、sd2。

    【讨论】:

    • 我添加了一个使用示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2011-11-01
    相关资源
    最近更新 更多