Собственная сумма в пользовательской операции tensorflow C++ с Eigen::half на GPUDevice

Я пытаюсь создать собственный тензорный поток Op. Я получил несколько операций для работы, используя https://www.tensorflow.org/versions/master/how_tos/adding_an_op/index.html и обычный C++.

Проблема возникает при использовании фреймворка Eigen C++ и его редуктора .sum. Он работает для CPU с типами double, float и Eigen::half, но на GPU ломается при использовании Eigen::half во время компиляции.

Я сократил проблему до копии l2loss_op с https://github.com/tensorflow/tensorflow/tree/master/tensorflow/core/kernels, где я переименовал L2Loss в CustomL2Loss (иначе возникают конфликты имен). См.: https://gist.github.com/AndreasMadsen/4335215cd4293daad3cad745bbeae82a.

Ошибка довольно длинная: https://gist.github.com/AndreasMadsen/5cd0579267f0bc3e5a1c21f2341d9ad6

Поскольку это работает для всех других случаев, кроме <GPUDevice, Eigen::half> (подтверждено комментарием строки в l2loss_op.cu.cc), я подумал, не было ли это проблемой тензорного потока. Но я могу скомпилировать сам тензорный поток.


person AndreasMadsen    schedule 01.11.2016    source источник
comment
Можете ли вы попробовать вызвать nvcc с помощью -arch calculate_35? Тот факт, что nvcc не знает о __shfl_down, похоже, указывает на то, что вы ориентируетесь на архитектуру, которая не поддерживает 16-битные числа с плавающей запятой.   -  person Benoit Steiner    schedule 03.11.2016
comment
Спасибо, -arch compute_35 исправил. Не могли бы вы добавить это как ответ, чтобы я мог его принять?   -  person AndreasMadsen    schedule 05.11.2016
comment
Я добавил ответ.   -  person Benoit Steiner    schedule 09.11.2016


Ответы (1)


Для поддержки половинных поплавков требуется архитектура cuda выше или равная 3.5. Вам нужно скомпилировать с флагом -arch calculate_35, чтобы активировать соответствующие инструкции.

person Benoit Steiner    schedule 09.11.2016