Шаблоны типов данных ComputeLibrary - PullRequest
0 голосов
/ 29 декабря 2018

В ARM ComputeLibrary мы можем иметь объект Tensor различных типов.При выборе типа Tensors мы передаем тип инициализатору распределителя Tensor, например, float32 здесь:

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

Лучшее введение в тему размещения тензорных элементов можно найти здесь .

Существует несколько типов ARMCL на выбор ( см. Здесь список ).Обратите внимание, что типы ComputeLibrary не являются примитивными, хотя можно легко скопировать в них примитивные типизированные данные.

Однако при написании шаблонного кода C ++, где можно иметь функции, определенные для произвольных типов, этот «выбор типа, которыйэто не тип "создает проблему проектирования.

Скажем, я хочу написать функцию, которая принимает данные примитивных типов, таких как int, float или double.В шаблонной функции этот тип будет называться типом T (или любым другим).

Теперь скажите, что я хочу скопировать эти данные в Tensor ARMCL в рамках шаблонной функции.Этот тензор должен быть инициализирован с правильным типом данных.Нам нужно, чтобы этот тип данных хорошо подходил для типа T, поэтому, если T - это float, то наш ARMCL должен иметь тип F32, если T - это int, тогда наш тензордолжно быть S8 и т. д.

Нам нужно какое-то отображение между примитивными типами и типами ARMCL.

Был бы "хороший" и разумный подход иметь функцию полезности, котораяпринимает тип T и, возможно, использует оператор switch и что-то вроде std::is_same.Затем оператор switch возвращает соответствующий объект DataType ARM Compute Library для T?Или есть другой подход, который мог бы быть более элегантным?

Я искал документы , чтобы увидеть, обработано ли это уже, но пока безрезультатно.Если он не обрабатывается, то, возможно, это не относится к вопросу ARMCL и имеет более широкий охват.

1 Ответ

0 голосов
/ 29 декабря 2018

Хорошо ... типы armcl - это, если я правильно понимаю, значения enum.

Таким образом, возможный подход - это структура шаблона с полными специализациями с 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); }
...