【问题标题】:ComputeLibrary data type templatesComputeLibrary 数据类型模板
【发布时间】: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++ 代码时,可以为任意类型定义函数,这种“不是类型的类型选择”会产生设计问题。

假设我想编写一个函数来获取基本类型的数据,例如intfloatdouble。在模板化函数中,这种类型将被称为 T 类型(或其他类型)。

现在假设我想将此数据复制到模板化函数范围内的 ARMCL 张量。这个张量需要初始化为正确的数据类型。我们需要这个数据类型非常适合T,所以如果Tfloat,那么我们的ARMCL应该是F32类型,如果Tint,那么我们的张量应该是S8

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

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

我一直在查看the docs 以查看是否已处理,但无济于事。如果不处理,那么这可能不是 ARMCL 问题所特有的,而是范围更广。

【问题讨论】:

  • "T 并且可能使用 switch 语句,以及类似 std::is_same 的东西。" 不,这种方法会失败,因为 switch() 是在运行时评估的。通常此类事情的方法是 SFINAE 和专业化,可以在编译时进行评估。
  • 我的眼界已经开阔到更大的世界,之前从未听说过 SFINAE。将调查。感谢您解释为什么我的方法可能不起作用

标签: c++ templates arm simd


【解决方案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); }

【讨论】:

  • 这正是我正在寻找的解决方案,谢谢! typeMap 结构本质上是可重用的,并且易于添加。好图案
猜你喜欢
  • 2022-01-20
  • 2011-03-11
  • 1970-01-01
  • 2019-04-01
  • 2019-11-10
  • 2016-05-31
  • 2014-09-16
  • 1970-01-01
  • 2021-03-18
相关资源
最近更新 更多