C++ 使用模板切换SSE内部函数
我使用模板专门化方式切换浮点/双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
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。这是
精度
而不是预测
!:)我添加了一个使用示例。