【问题标题】:does tensorflow tf.slice incur allocation and/or memory copy?tensorflow tf.slice 会导致分配和/或内存复制吗?
【发布时间】:2018-11-19 15:35:40
【问题描述】:

b = tf.slice(a, [...], [...])

分配一个新的内存缓冲区然后从a的缓冲区复制?还是 a 和 b 共享同一个缓冲区?

然后呢

... = tf.nn.convolution(tf.slice(a, [...], [...]), ...)

在这种情况下,切片没有被命名。这会导致分配和复制吗?

一般来说,是否有一些资源可以学习这些内存管理细节?

谢谢!

【问题讨论】:

  • 请标记语言python。 “tensorflow”不是一种语言,它是一种 API。
  • 感谢@coldspeed。虽然我的代码的语法是 python,但这个问题并不特定于 python,因为它只是一个绑定。这就是为什么我犹豫将其标记为 python。
  • 请注意,答案也可能取决于语言。
  • @cs95:不,这个答案不依赖于语言。无论您使用哪种语言,它都是 TF 中的SliceOp

标签: python tensorflow memory-management


【解决方案1】:

我也很好奇,于是进入了tf.slice的内核实现。

唯一没有分配内存的时间是切片是标识切片(因此没有更改),并且切片是维度 0 对齐的。

Identity Lines

  if (is_identity) {
    VLOG(1) << "Slice identity";
    context->set_output(0, input);
    *done = true;
    return;
  }

Dim0Aligned

  if (slice_dim0 &&
      IsDim0SliceAligned<T>(input.shape(), (*begin)[0], (*size)[0])) {
    VLOG(1) << "Slice dim 0: " << input.shape().DebugString();
    CHECK_GE(input.dims(), 1);  // Otherwise, is_identity should be true.
    context->set_output(0, input.Slice((*begin)[0], (*begin)[0] + (*size)[0]));
    *done = true;
    return;
  }

否则会调用下面的

  OP_REQUIRES_OK(context, context->allocate_output(0, *output_shape, result));

【讨论】:

  • 我不明白答案。切片时是否复制数据?是还是不是?
  • @LucG,如果您使用标识切片或维度 0 对齐的切片进行切片,则没有数据副本。否则,有一个副本。
  • 感谢您的改写,现在一切都说得通了。对不起。
猜你喜欢
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 2012-08-10
  • 1970-01-01
  • 2016-06-17
  • 2011-11-09
  • 1970-01-01
相关资源
最近更新 更多