【发布时间】:2018-05-25 21:31:02
【问题描述】:
假设我有一个函数 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 等架构。
【问题讨论】:
-
您需要专门针对 add 例程吗?你不能只列出每种类型的重载列表吗?然后,您的模板化
add()函数代码将简单地调用相关的重载。 -
你的方法的问题是所有的 simd_add 无论类型如何都将它们的输入作为 __mm 寄存器,所以不能重载
-
啊,这就解释了。 :)
-
我可能在这里遗漏了一些东西,但是如果你有两个函数用相同的参数类型做两件不同的事情,为什么不给它们不同的名字呢?
-
因为我希望模板添加通过将自己的模板类型传递给它来简单地使用 SIMD_add。所以我不必多次编写添加函数
标签: c++