【发布时间】:2018-12-29 10:37:56
【问题描述】:
在ARM ComputeLibrary中,我们可以有一个各种类型的张量对象。在选择Tensor的类型时,我们将类型传递给Tensor的分配器的initialiser,比如这里的float32:
my_tensor.allocator()->init(armcl::TensorInfo(shape_my_tensor, 1, armcl::DataType::F32));
张量分配这个话题的更好介绍可以看here。
有多种 ARMCL 类型可供选择 (see here for a list)。请注意,ComputeLibrary 类型不是原始类型,尽管可以轻松地将原始类型数据复制到它们。
但是,在编写模板化 C++ 代码时,可以为任意类型定义函数,这种“不是类型的类型选择”会产生设计问题。
假设我想编写一个函数来获取基本类型的数据,例如int、float 或double。在模板化函数中,这种类型将被称为 T 类型(或其他类型)。
现在假设我想将此数据复制到模板化函数范围内的 ARMCL 张量。这个张量需要初始化为正确的数据类型。我们需要这个数据类型非常适合T,所以如果T是float,那么我们的ARMCL应该是F32类型,如果T是int,那么我们的张量应该是S8等
我们需要在原始类型和 ARMCL 类型之间进行某种映射。
一个“不错”且明智的方法是拥有一个采用T 类型的实用程序函数,并且可能使用switch 语句,以及类似std::is_same 的东西。然后 switch 语句将为T返回适当的 ARM Compute Library DataType 对象?还是有其他更优雅的方法?
我一直在查看the docs 以查看是否已处理,但无济于事。如果不处理,那么这可能不是 ARMCL 问题所特有的,而是范围更广。
【问题讨论】:
-
"T 并且可能使用 switch 语句,以及类似
std::is_same的东西。" 不,这种方法会失败,因为switch()是在运行时评估的。通常此类事情的方法是 SFINAE 和专业化,可以在编译时进行评估。 -
我的眼界已经开阔到更大的世界,之前从未听说过 SFINAE。将调查。感谢您解释为什么我的方法可能不起作用