tenorflow tf.slice подвергается выделению и / или копированию памяти? - PullRequest
0 голосов
/ 10 июня 2018

Выделяет ли

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

новый буфер памяти и затем копирует из буфера?или a и b совместно используют один и тот же буфер?

И как насчет

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

В этом случае срез не именуется.Влечет ли это выделение и копирование?

В общем, есть ли какой-нибудь ресурс для изучения этих деталей управления памятью?

Спасибо!

1 Ответ

0 голосов
/ 16 ноября 2018

Мне тоже было любопытно, и я вошел в реализацию ядра tf.slice.

Единственное время, когда память не выделяется, это когда слайс является идентичным слайсом (такбез изменений), и когда срез выровнен по размеру 0.

Линии идентификации

  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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...