输出注意事项#
创建于:2025 年 4 月 24 日 | 最后更新于:2025 年 4 月 24 日
当用户将一个或多个张量传递给 `out=` 参数时,约定如下:
如果 `out` 张量没有元素,它将被调整为计算结果的形状、步幅和内存格式。
如果 `out` 张量的形状与计算结果不同,则会抛出错误,或者 `out` 张量将被调整为与输出计算结果相同的形状、步幅和内存格式,就像没有元素的张量一样。(这种调整大小的行为已被弃用,PyTorch 正在更新其运算符以始终抛出错误。)
传递具有正确形状的 `out=` 张量在数值上等同于执行操作并将结果“安全复制”到(可能已调整大小的)`out` 张量。在这种情况下,步幅和内存格式将保留。
不支持传递需要梯度的 `out=` 张量。
如果将多个张量传递给 `out=`,则上述行为将独立应用于每个张量。
“安全复制”不同于 PyTorch 的常规复制。对于不参与类型提升的操作,源张量和目标张量的设备和数据类型必须匹配。对于参与类型提升的操作,复制可以到不同的数据类型,但复制的目标不能低于源的“类型种类”。PyTorch 有四种类型种类:布尔型、整型、浮点型和复数型,按此顺序排列。因此,例如,像 `add` 这样的操作(参与类型提升)如果给定浮点输入但整数 `out=` 张量,则会抛出运行时错误。
请注意,尽管对于形状正确的张量,`out=` 的数值行为是执行操作然后“安全复制”其结果,但幕后操作可能会重用 `out=` 张量的存储并融合复制以提高效率。许多操作,如 `add`,都会执行这些优化。此外,尽管 PyTorch 的“`out=` 契约”如上所述,但 PyTorch 中的许多操作并未正确实现该契约,需要更新。