评价此页

Out Notes#

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

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

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

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

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

  • 传递需要梯度的 out= 张量不受支持。

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

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

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