如何抽象模板函数中使用的 simd 代码
How to abstract simd code used in template function
所以想象一下我有一个函数 add
template<class type>
type* add(type*,type* x, int len)
{
type *result = new type[len];
for(int i = 0; i < len; i += simd_reg_size)
{
// do addition here
}
return result;
}
我想使用模板专用化,以便为我想支持的每种数据类型编写一个专门的添加函数,但是我想到的语法似乎无效。
template<>
__m256 SIMD_add<float>(__m256 x, __m256 y){
return _mm256_add_ps(x, y);
}
我不是 c++ 方面的专家,但据我所知,我必须在参数或参数中使用 templete 类型。我还想到用类似于
#define simd_add(x, y, type)
if type == int
simd_add_integer(x, y)
但是环顾四周,似乎没有办法在宏中实际执行条件语句。我该怎么办?对我来说重要的是,语法足够灵活,允许我抽象架构,例如 x86。
事实证明,我可以简单地创建一个模板类,并且所有方法都是静态的,编译器将允许我在函数中不使用模板类型的情况下进行模板专用化。
对于模板函数,专用化类型直接定义,您将在其中使用模板类类型,而不会像以前那样附加到函数名称。
所以你对__m256
的专业功能将是
template<>
__m256 SIMD_add(__m256 x, __m256 y){
return _mm256_add_ps(x, y);
}
就像你提到的,如果你想将你的"add"方法添加到模板类中,无论专用化如何,只需将其声明为标准方法即可。
您可以查看函数模板的显式专用化,这里有一个关于__m256寄存器添加的类似问题。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 如何抽象模板函数中使用的 simd 代码
- 如何在没有性能命中的情况下抽象SIMD代码来处理不同的数据类型
- 手动SIMD代码可负担性
- 在使用英特尔内部函数对 SIMD 代码进行编程时,如何强制使用 vmovapd 而不是 vmovupd?
- SIMD/SSE代码在Windows 8上清楚地运行在Windows 7和Linux上
- 使用 SIMD 管理累积(单个)值的清理代码循环的方法是什么
- GCC -msse2 不会生成 SIMD 代码
- 如何使用 gcc 编译 SIMD 代码
- 为什么我的散点代码的性能比Vc SIMD更好