评价此页

发布说明#

创建日期:2025年4月24日 | 最后更新日期:2025年4月24日

当用户将一个或多个张量传递给 out= 时,约定如下:

  • 如果 out 张量没有元素,它将被调整为计算输出的形状、步幅和内存格式。

  • 如果 out 张量的形状与计算结果不同,则会引发错误,或者 out 张量将被调整为与计算输出相同的形状、步幅和内存格式,就像没有元素的张量一样。(此调整行为已被弃用,PyTorch 正在更新其算子以一致地抛出错误。)

  • 传递具有正确形状的 out= 张量在数值上等同于执行计算并将结果“安全复制”到(可能已调整大小的)out 张量中。在这种情况下,步幅和内存格式会被保留。

  • 不支持传递 grad 需要的 out= 张量。

  • 如果将多个张量传递给 out=,则上述行为独立适用于每个张量。

“安全复制”与 PyTorch 的常规复制不同。对于不参与类型提升的运算,源张量和目标张量的设备和 dtype 必须匹配。对于参与类型提升的运算,复制可以到不同的 dtype,但复制的目标不能是比源张量更低的“类型种类”。PyTorch 有四种类型种类:布尔型、整型、浮点型和复数型,按此顺序。因此,例如,像 add 这样的运算(它参与类型提升)如果输入为浮点型但 out= 张量为整型,则会引发运行时错误。

请注意,虽然正确形状张量的 out= 的数值表现是执行运算然后“安全复制”其结果,但在后台,运算可能会重用 out= 张量的存储并融合复制操作以提高效率。许多运算,如 add,都会执行这些优化。此外,尽管上述指定了 PyTorch 的“out= 约定”,但 PyTorch 中的许多运算并未正确实现该约定,需要进行更新。