2017-03-08 165 views
0

我正在C++中編寫自定義張量流操作,我想知道如何執行一個張量的深度拷貝到另一個張量。換句話說,我需要從一個張量到另一個張量的元素明智的拷貝,這樣他們就不會共享底層的內存緩衝區。Tensorflow C++快速張量深拷貝

我發現的最接近的東西是DeepCopy(在tensor_util.h中定義)。問題是我需要這個操作要快,文件明確指出,此功能尚未針對速度進行了優化:更

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

詳細一點:我使用Tensorflow在GPU上,所以基本上我想要什麼要做的是讓TF啓動一個cudaMemcpy,其中源和目標都是設備指針。 TF確實可以訪問張量指針(tensor.tensor_data()。data()),但是如果你嘗試使用cudaMemcpy(他們必須處理重疊的cuda上下文;不好),你會很快遇到問題。

在此先感謝!

+0

它看起來像當我試圖手動cudaMalloc是我得到的例外由於正交問題。一旦解決了,它就會起作用,儘管我有點用這種方式對TF的內部進行破解。 –

回答

0

目前對於「快速」深層拷貝,TensorFlow使用Eigen來實現CPU和GPU版本。被徵,代碼模板深刻,但相關的代碼是在這裏(從dense_update_ops.h複製):

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; 
    } 
};