В 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 и носит более широкий характер.
std::is_same
. Нет, этот подход не сработает, посколькуswitch()
оценивается во время выполнения. Обычный подход для таких вещей — SFINAE и специализации, которые можно оценить в время компиляции. - person πάντα ῥεῖ   schedule 29.12.2018