ComputeLibrary数据类型模板

时间:2018-12-29 10:37:57

标签: c++ templates arm simd

ARM ComputeLibrary中,我们可以具有各种类型的Tensor对象。在选择Tensor的类型时,我们将类型传递给Tensor分配器的初始化器,例如float32此处:

my_tensor.allocator()->init(armcl::TensorInfo(shape_my_tensor, 1, armcl::DataType::F32));

可以找到here,更好地介绍张量分配。

see here for a list)有几种ARMCL类型可供选择。请注意,尽管ComputeLibrary类型不是原始类型,但可以轻松地将原始类型的数据复制到它们。

但是,当编写模板化的C ++代码时,可以为任意类型定义函数,这种“不是类型的类型选择”会带来设计问题。

说我想编写一个函数,该函数采用原始类型的数据,例如intfloatdouble。在模板函数中,此类型将称为T类型(或其他类型)。

现在说我想将此数据复制到模板化函数范围内的ARMCL Tensor。该张量需要初始化为正确的数据类型。我们需要此数据类型以适合类型T,因此,如果Tfloat,则我们的ARMCL应该是F32类型,如果{{1 }}是T,则我们的张量应为int,依此类推。

我们需要在原始类型和ARMCL类型之间进行某种映射。

将有一个实用程序函数采用S8类型,并且可能使用switch语句,以及类似T的“明智”且明智的方法。然后,switch语句将为std::is_same返回适当的ARM Compute Library DataType对象?还是有其他方法可能更优雅?

我一直在寻找the docs周围的地方,以查看是否已经处理完毕,但仍无济于事。如果未处理,则可能不是ARMCL问题特有的,而且范围更广。

1 个答案:

答案 0 :(得分:1)

好吧,如果我理解正确,armcl类型就是枚举值。

因此,一种可行的方法是使用带有value的完全专业化的模板结构。

我的意思是...类似

template <typename>
struct typeMap;

template <>
struct typeMap<int>
 { static constexpr auto value = armcl::DataType::S8; };

template <>
struct typeMap<float>
 { static constexpr auto value = armcl::DataType::F32; };

// other cases 

您可以按以下方式使用它

template <typename T>
void foo ()
 { bar(typeMap<T>::value); }