3

テンプレートの特殊化方法を使用して、float/double 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-intrinsics 関数を同じように使用する方法がわかりませんか? スイッチ加算操作が必要であると仮定します: float の場合は _mm_add_ps 組み込み、double の場合は _mm_add_pd です。テンプレートの特殊化トリックを使用するにはどうすればよいですか?

4

2 に答える 2

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 に答える