2017-03-08 7 views
0

Ich schreibe eine benutzerdefinierte Tensorflow-Op in C++ und ich möchte wissen, wie ich eine tiefe Kopie von einem Tensor in einen anderen durchführen kann. Mit anderen Worten, ich möchte eine elementweise Kopie von einem Tensor zu einem anderen, so dass sie nicht dazu gebracht werden, einen zugrundeliegenden Speicherpuffer zu teilen.Tensorflow C++ schnelle Tensor tiefe Kopie

Das nächste, was ich gefunden habe, ist DeepCopy (definiert in tensor_util.h). Das Problem ist, ich brauche diesen Vorgang schnell zu sein und die Dokumentation wird deutlich, dass diese Funktion für die Geschwindigkeit nicht optimiert wurde:

// DeepCopy returns a tensor whose contents are a deep copy of the 
// contents of 'other'. This function is intended only for 
// convenience, not speed. 

Etwas ausführlicher: Ich verwende Tensorflow auf der GPU, so dass im Grunde, was ich will Zu tun ist, dass TF einen cudaMemcpy einleitet, wobei Quelle und Ziel Gerätezeiger sind. TF gibt Zugriff auf Tensor Zeiger (tensor.tensor_data(). Data()), aber Sie stoßen ziemlich schnell auf Probleme, wenn Sie versuchen, cudaMemcpy mit ihnen (sie haben mit überlappenden Cuda Kontexten zu tun, nicht nett).

Vielen Dank im Voraus!

+0

Es ist wie die Ausnahmen sieht ich immer war, als ich ein Handbuch cudaMalloc versucht waren aufgrund einer orthogonalen Ausgabe. Sobald es gelöst ist, funktioniert es, obwohl ich ein wenig misstrauisch bin, auf diese Weise mit den Interna von TF herumzuspielen. –

Antwort

0

Gegenwärtig verwendet "TensorFlow" für "schnelle" tiefe Kopien Eigen, um CPU- und GPU-Versionen zu implementieren. Sein Eigen, ist der Code tief auf Vorlagen, aber der entsprechende Code ist hier (von dense_update_ops.h kopiert):

template <typename Device, typename T> 
struct DenseUpdate<Device, T, ASSIGN> { 
    void operator()(const Device& d, typename TTypes<T>::Flat params, 
        typename TTypes<T>::ConstFlat update) { 
    params.device(d) = update; 
    } 
};