2016-11-01 1 views
1

Ich versuche, eine benutzerdefinierte Tensorflow Op. Ich habe einige Ops zu Arbeiten mit https://www.tensorflow.org/versions/master/how_tos/adding_an_op/index.html und normalen C++ bekommen.Eigen Summe in benutzerdefinierten Tensorflow C++ op mit Eigen :: half auf GPUDevice

Das Problem tritt auf, wenn das Eigen C++ - Framework und sein .sum Reducer verwendet werden. Es funktioniert für die CPU mit den Typen double, float und Eigen::half, aber auf der GPU bricht es bei der Verwendung Eigen::half, zur Kompilierzeit.

Ich habe das Problem auf eine Kopie der l2loss_op von https://github.com/tensorflow/tensorflow/tree/master/tensorflow/core/kernels reduziert, wo ich L2Loss zu CustomL2Loss umbenannt (sonst ich Namenskonflikte zu bekommen). Siehe: https://gist.github.com/AndreasMadsen/4335215cd4293daad3cad745bbeae82a

Der Fehler ist ziemlich lang: https://gist.github.com/AndreasMadsen/5cd0579267f0bc3e5a1c21f2341d9ad6

Da es für alle anderen Fälle funktioniert, aber <GPUDevice, Eigen::half> (bestätigt durch die Zeile aus in l2loss_op.cu.cc Kommentierung) Ich erwäge, ob dies ein tensorflow Problem. Aber ich kann Tensorflow selbst kompilieren.

+1

Können Sie versuchen, nvcc mit -arch compute_35 aufzurufen? Die Tatsache, dass nvcc nichts über __shfl_down weiß, scheint darauf hinzudeuten, dass Sie auf eine Architektur abzielen, die 16-Bit-Floats nicht unterstützt. –

+0

Danke, '-arch compute_35' behebt es. Könnten Sie es als Antwort hinzufügen, damit ich es akzeptieren kann? – AndreasMadsen

+0

Ich habe eine Antwort hinzugefügt. –

Antwort

1

Die Unterstützung für Halbschwimmer erfordert eine Cuda-Architektur größer oder gleich 3,5. Sie müssen mit dem Flag -arch compute_35 kompilieren, um die entsprechenden Anweisungen zu aktivieren.