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

时间:2018-05-25 21:31:03

标签: c++

所以想象我有一个函数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 ++专家,但据我所知,我必须在参数或参数中使用模板类型。我还想过写一个类似于

的宏
#define simd_add(x, y, type)
 if type == int
     simd_add_integer(x, y)

然而,环顾四周,似乎没有办法在宏中实际执行条件语句。我该怎么办 ?对我来说很重要的是语法足够灵活,允许我除了x86之外还抽象arm等架构。

2 个答案:

答案 0 :(得分:0)

对于模板函数,特殊化类型直接定义在您使用模板类类型的位置,而不像您那样附加到函数名称。

因此__m256的专用函数将是

template<>
__m256 SIMD_add(__m256 x, __m256 y){
    return _mm256_add_ps(x, y);
}

就像你提到的,如果你想添加你的&#34;添加&#34;模板类的方法,无论专业化,只需将其声明为标准方法即可。

您可以查看一下Explicit specializations of function templates,这是关于__m256 registers addition的类似问题。

答案 1 :(得分:0)

事实证明,我可以简单地创建一个模板类,并且所有方法都是静态的,编译器将允许我在不使用函数中的模板类型的情况下进行模板特化。

相关问题