在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 ++代码时,可以为任意类型定义函数,这种“不是类型的类型选择”会带来设计问题。
说我想编写一个函数,该函数采用原始类型的数据,例如int
,float
或double
。在模板函数中,此类型将称为T
类型(或其他类型)。
现在说我想将此数据复制到模板化函数范围内的ARMCL Tensor。该张量需要初始化为正确的数据类型。我们需要此数据类型以适合类型T
,因此,如果T
是float
,则我们的ARMCL应该是F32
类型,如果{{1 }}是T
,则我们的张量应为int
,依此类推。
我们需要在原始类型和ARMCL类型之间进行某种映射。
将有一个实用程序函数采用S8
类型,并且可能使用switch语句,以及类似T
的“明智”且明智的方法。然后,switch语句将为std::is_same
返回适当的ARM Compute Library DataType对象?还是有其他方法可能更优雅?
我一直在寻找the docs周围的地方,以查看是否已经处理完毕,但仍无济于事。如果未处理,则可能不是ARMCL问题特有的,而且范围更广。
答案 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); }