【问题标题】:Tensorflow C++ fast Tensor deep copyTensorflow C++ 快速张量深拷贝
【发布时间】:2017-03-08 08:34:38
【问题描述】:

我正在用 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.

更多细节:我在 GPU 上使用 Tensorflow,所以基本上我想做的是让 TF 启动一个 cudaMemcpy,其中源和目标都是设备指针。 TF 确实提供了对张量指针 (tensor.tensor_data().data()) 的访问权限,但是如果您尝试对它们进行 cudaMemcpy 操作,您很快就会遇到问题(它们与重叠的 cuda 上下文有关;不好)。

提前致谢!

【问题讨论】:

  • 看起来我在尝试手动 cudaMalloc 时遇到的异常是由于正交问题。一旦解决,它就可以工作,尽管我对以这种方式处理 TF 的内部结构有点怀疑。
  • 您能提供您的解决方案的任何示例代码吗?

标签: c++ tensorflow


【解决方案1】:

目前对于“快速”深度复制,TensorFlow 使用 Eigen 来实现 CPU 和 GPU 版本。作为Eigen,代码是深度模板化的,但是相关代码在这里(复制自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;
  }
};

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2015-07-21
    相关资源
    最近更新 更多