3

我使用模板专业化方式来切换浮点/双 SSE 内在函数:

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 用于双精度数。我怎样才能使用模板专业化技巧呢?

4

2 回答 2

4

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

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);
}

等等

于 2013-07-22T15:22:08.323 回答
1

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

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进行适当的初始化。

于 2013-07-22T15:25:22.197 回答