Developers
Download
[object Object][object Object]

[object Object]

带指定舍入模式的逐元素类型转换。

[object Object]

对每个元素 [object Object] 在有效区域内:

dsti,j=castrmode ⁣(srci,j)\mathrm{dst}_{i,j} = \mathrm{cast}_{\mathrm{rmode}}\!\left(\mathrm{src}_{i,j}\right)

其中 [object Object] 是舍入策略(参见 [object Object])。

[object Object]

同步形式:

[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]

声明于 [object Object][object Object]

[object Object]
[object Object]
[object Object]
  • [object Object][object Object] 必须在形状/有效区域方面兼容,如实现所要求的。
  • 对于给定的 [object Object],转换 [object Object] 必须被目标支持。
  • 实现说明 (Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品/Ascend 950PR/Ascend 950DT):
    • 一种形式接受显式的 [object Object],指定的饱和行为会直接传递给实现。
    • 另一种形式不显式给出 [object Object];此时实现会针对具体类型对选择目标定义的默认饱和行为。
    • 在CPU实现中,目前仅实现了不显式传入 [object Object] 的形式。
  • 临时Tile:
    • C++ API提供显式传入 [object Object] Tile的重载。在Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品上,当 [object Object] 用于 [object Object][object Object][object Object] 时,PyTorch兼容的非饱和窄化路径会使用该临时Tile。其他转换不需要tmp空间。
    • 实现会将 [object Object] 转换为 [object Object] 使用;因此应按字节数来规划tmp Tile大小,而不是按 [object Object] 的类型理解。
    • 下列公式给出按实现使用的32字节向量块粒度向上取整后的最小分配大小。若 [object Object],不会发起需要tmp的转换,所需tmp大小为 [object Object]
    • 公共参数:
      • [object Object]
      • [object Object]
      • [object Object],单位为源元素个数。
      • [object Object][object Object][object Object]
    • [object Object],非饱和 ([object Object]):
      • 临时结果是第一步 [object Object] 转换产生的 [object Object] Tile。
      • 由于 [object Object] 源行受Tile约束保证32字节对齐,[object Object] 是以32字节块为单位的源repeat stride。
      • 对齐的主区域中,一次调用处理一行,最多处理 [object Object] 个repeat,每个repeat为 [object Object] 个元素: tmpHeadBytes=4×64×min(C64,255)\text{tmpHeadBytes} = 4 \times 64 \times \min\left(\left\lfloor\frac{C}{64}\right\rfloor, 255\right)
      • 尾部区域中,一次调用最多处理 [object Object] 行,并使用源行stride。由于向量repeat stride以块为单位,空间范围按32字节块计算: $$ \text{tmpTailBytes} = \begin{cases} 32 \times \left((\min(R, 255) - 1) \times \frac{SS}{8} + \left\lceil\frac{C \bmod 64}{8}\right\rceil\right), & C \bmod 64 > 0 \ 0, & C \bmod 64 = 0 \end{cases} $$
      • 该路径所需的最小tmp大小为: tmpFloatToInt16Bytes=max(tmpHeadBytes,tmpTailBytes)\text{tmpFloatToInt16Bytes} = \max(\text{tmpHeadBytes}, \text{tmpTailBytes})
      • 对主区域而言,一个紧凑的完整repeat上界是 [object Object] 字节;但当 [object Object] 较大时,尾部会按源行stride写入,所需空间可能更大。
    • [object Object],非饱和 ([object Object]):
      • 实现按行处理,每行拆分为不超过 [object Object] 个元素的子块,并在每个子块之间复用同一段临时缓冲区。对于 [object Object],令: H=min(C,64)H = \min(C, 64)
      • 该路径所需的最小tmp大小为: tmpHalfToInt16Bytes=32×H8\text{tmpHalfToInt16Bytes} = 32 \times \left\lceil\frac{H}{8}\right\rceil
      • 对任意非空Tile,该路径的形状无关上界为 [object Object] 字节。
    • [object Object],非饱和 ([object Object]):
      • 实现同样按不超过 [object Object] 个元素的子块处理,并复用同一段256字节临时区域。第一步最多将 [object Object][object Object] 写入字节 [object Object];完成 [object Object] 窄化后,字节 [object Object] 保存 [object Object] 值,字节 [object Object] 被复用为scratch。
      • [object Object] 会前进 [object Object] 字节,因此它指向同一256字节临时区域的上半部分,不需要额外再分配256字节。
      • 该路径所需的最小tmp大小为: tmpHalfToInt8Bytes=max(32×H8, 128+32×H16)\text{tmpHalfToInt8Bytes} = \max\left(32 \times \left\lceil\frac{H}{8}\right\rceil,\ 128 + 32 \times \left\lceil\frac{H}{16}\right\rceil\right)
      • 对任意非空Tile,该路径的形状无关上界为 [object Object] 字节。
    • 覆盖所有tmp-backed TCVT转换的总体最小值:
      • 由于 [object Object],对于同一形状,能覆盖所有会使用tmp的TCVT转换路径的最小tmp大小为: tmpSizeAllBytes=max(tmpFloatToInt16Bytes, tmpHalfToInt8Bytes)\text{tmpSizeAllBytes} = \max(\text{tmpFloatToInt16Bytes},\ \text{tmpHalfToInt8Bytes})
      • 如果Tile非空,并且half路径使用形状无关的紧凑上界即可,也可写为: tmpSizeAllBytes=max(tmpFloatToInt16Bytes, 256)\text{tmpSizeAllBytes} = \max(\text{tmpFloatToInt16Bytes},\ 256)
    • 对于不需要PyTorch兼容tmp-backed路径的转换,或者原生饱和行为已经满足需求时,可以继续使用不带 [object Object] 的重载。
[object Object][object Object]undefined

说明:

  • 关键差异:Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品支持I32 -> FP16(half,deq路径),Ascend 950PR/Ascend 950DT不支持I32 -> FP16。
  • Ascend 950PR/Ascend 950DT上不支持FP16 -> FP8_E4M3和FP16 -> FP8_E5M2。
[object Object][object Object]
[object Object]
[object Object]
[object Object]
[object Object][object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]