快捷方式

MaybeOwned<Tensor>

MaybeOwned<Tensor> 是一个 C++ 智能指针类,它动态编码 Tensor 是拥有还是借用。它用于某些对性能敏感的情况,以避免不必要地增加 Tensor 的引用计数(但会因额外的间接寻址而产生少量开销)。

警告

必须极其谨慎地使用 MaybeOwned。所有权(或非所有权)声明未经过静态检查,错误可能会导致引用计数不足和释放后使用崩溃。

由于缺乏这种安全保障,我们不鼓励在已知对性能高度敏感的代码路径之外使用 MaybeOwned。但是,如果您在想要修改的代码中遇到对 MaybeOwned 的现有使用,则了解如何正确使用它至关重要。

MaybeOwned<Tensor> 的主要用例是一个函数或方法,它动态地选择是返回其参数之一(通常来自直通或“无操作”代码路径),还是返回新构建的 Tensor。这样的函数会在两种情况下都返回 MaybeOwned<Tensor>,前者通过调用 MaybeOwned<Tensor>::borrowed() 处于“借用”状态,后者通过调用 MaybeOwned<Tensor>::owned() 处于“拥有”状态。

典型的例子是 Tensorexpect_contiguous 方法,当已经连续时,它会快捷方式并返回借用的自引用

inline c10::MaybeOwned<Tensor> Tensor::expect_contiguous(MemoryFormat memory_format) const & {
  if (is_contiguous(memory_format)) {
    return c10::MaybeOwned<Tensor>::borrowed(*this);
  } else {
    return c10::MaybeOwned<Tensor>::owned(__dispatch_contiguous(memory_format));
  }
}

使用生命周期的词汇,借用的基本安全要求是借用的 Tensor 必须比任何借用它的引用活得更长。例如,在这里,我们可以安全地借用 *this,但是 __dispatch_contiguous() 返回的 Tensor 是新创建的,借用引用实际上会使其无人拥有。

因此,一般经验法则

  • 当有疑问时,完全不要使用 MaybeOwned<Tensor> - 特别是,尽量避免在尚未使用它的代码中使用它。只有在关键(且可证明的)性能提升时才应引入新的用法。

  • 当修改或调用已使用 MaybeOwned<Tensor> 的代码时,请记住,通过调用 MaybeOwned<Tensor>::owned() 从手中的 Tensor 生成 MaybeOwned<Tensor> 始终是安全的。这可能会导致不必要的引用计数,但绝不会导致行为异常 - 因此,除非您要包装的 Tensor 的生命周期非常清楚,否则它始终是更安全的选择。

更多详细信息和实现代码可以在 <https://github.com/pytorch/pytorch/blob/main/c10/util/MaybeOwned.h> 和 <https://github.com/pytorch/pytorch/blob/main/aten/src/ATen/templates/TensorBody.h> 中找到。

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取面向初学者和高级开发者的深入教程

查看教程

资源

查找开发资源并获得问题解答

查看资源