如何抽象模板函数中使用的 simd 代码

How to abstract simd code used in template function

本文关键字:代码 simd 函数 何抽象 抽象      更新时间:2023-10-16

所以想象一下我有一个函数 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寄存器添加的类似问题。