Шаблоны типов данных ComputeLibrary

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

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

Лучшее введение в тему тензорного распределения можно найти по адресу здесь.

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

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

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

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

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

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

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


person Prunus Persica    schedule 29.12.2018    source источник
comment
T и, возможно, с использованием оператора switch и чего-то вроде std::is_same. Нет, этот подход не сработает, поскольку switch() оценивается во время выполнения. Обычный подход для таких вещей — SFINAE и специализации, которые можно оценить в время компиляции.   -  person πάντα ῥεῖ    schedule 29.12.2018
comment
Мои глаза открылись для большего мира, я никогда раньше не слышал о SFINAE. будет расследовать. спасибо за объяснение, почему мой подход может не работать   -  person Prunus Persica    schedule 29.12.2018


Ответы (1)


Ну... типы 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); }
person max66    schedule 29.12.2018
comment
это именно то решение, которое я искал, спасибо! Структура typeMap по своей сути является многоразовой, и ее легко добавлять. Хороший образец - person Prunus Persica; 29.12.2018