tensorflow tf.slice 是否会产生分配和/或内存复制?

Hen*_*low 5 python memory-management tensorflow

b = tf.slice(a, [...], [...])
Run Code Online (Sandbox Code Playgroud)

分配一个新的内存缓冲区,然后从 a 的缓冲区复制?或者 a 和 b 共享相同的缓冲区吗?

还有,那又怎么样

... = tf.nn.convolution(tf.slice(a, [...], [...]), ...)
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Ouw*_*ang 4

我对此也很好奇,并进入了tf.slice.

唯一不分配内存的时间是当切片是标识切片时(因此没有变化),以及当切片以 0 维对齐时。

身份线

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

Dim0对齐

  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;
  }
Run Code Online (Sandbox Code Playgroud)

否则将调用以下内容

  OP_REQUIRES_OK(context, context->allocate_output(0, *output_shape, result));
Run Code Online (Sandbox Code Playgroud)