Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用模板切换SSE内部函数_C++_Metaprogramming_Sse_Simd - Fatal编程技术网

C++ 使用模板切换SSE内部函数

C++ 使用模板切换SSE内部函数,c++,metaprogramming,sse,simd,C++,Metaprogramming,Sse,Simd,我使用模板专门化方式切换浮点/双SSE内部函数: template<typename Precision> struct simd { typedef Precision simd_vector; }; template<> struct simd<float> { typedef __m128 simd_vector; }; template<> struct simd<double> { typedef

我使用模板专门化方式切换浮点/双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
}
模板
结构单指令多数据
{
typedef精度simd_向量;
};
模板
结构单指令多数据
{
typedef_uum128单指令多数据向量;
};
模板
结构单指令多数据
{
typedef_uum128d simd_向量;
};
int main()
{
simd::simd_向量浮点_向量;//uu m128
simd::simd_向量双_向量;//u m128d
}

它工作得很好,但我不明白如何以同样的方式使用SSE intrinsics函数?假设我们需要开关添加操作:_mm_add_ps intrinsive-用于浮点,而_mm_add_pd用于double。如何使用模板专业化技巧?

因为您可能需要为您可以想象的每个操作生成一行,所以您也可以使用适当的运算符:

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);
}
模板
结构单指令多数据
{
typedef_uum128d simd_向量;
};
simd::simd_向量运算符+(simd::simd_向量a,simd::simd_向量b)
{
返回(a,b),;
}

等等。

您可以使用适当的函数专门化每个类,这些函数调用它们相应的函数

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
    }
};
模板
结构单指令多数据
{
typedef_uum128单指令多数据向量;
simd_向量v;
simd运算符+(常量simd和\U s){
//调用浮点数的我的simd函数到v上的运算符
}
};
模板
结构单指令多数据
{
typedef_uum128d simd_向量;
simd_向量v;
simd运算符+(常量simd和\U s){
//调用我的simd函数使Double在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;
simd-sf1、sf2;
simd sf3=sf1+sf2;
//得到矢量投掷sd3.v;
simd sd1、sd2;
simd sd3=sd1+sd2;
//通过sd3.v获得矢量;

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

这是
精度
而不是
预测
!:)我添加了一个使用示例。