pypto_pro.language.simt.fmod#

产品支持情况#

  • Ascend 950PR&950DT系列产品:支持

  • Atlas A3系列产品:不支持

  • Atlas A2系列产品:不支持

功能说明#

计算两个DT_FP32标量相除的浮点余数。对于有限输入且rhs不为0,其数学语义如下:

\[result = lhs - \operatorname{trunc}(lhs / rhs) \times rhs\]

公式中的trunc表示将中间商lhs / rhs向零取整。结果的符号与被除数lhs一致,绝对值小于除数rhs的绝对值。

该接口与Python的%运算符语义不同。例如,fmod(-5.5, 2.0)为-1.5,而Python表达式-5.5 % 2.0的结果为0.5。

函数原型#

pypto_pro.language.simt.fmod(
    lhs: float,
    rhs: float,
) -> Scalar

参数说明#

参数

输入/输出

说明

lhs

输入

被除数,浮点型常量或运行时浮点标量表达式,仅支持DT_FP32。Tensor或Tile元素需通过下标访问后传入。

rhs

输入

除数,浮点型常量或运行时浮点标量表达式,仅支持DT_FP32。Tensor或Tile元素需通过下标访问后传入。

约束说明#

只能在由@pypto_pro.language.vector_function(mode=”simt”)定义的SIMT入口函数或辅助函数中调用。

返回值说明#

返回DT_FP32类型的Scalar。特殊输入的行为如下:

输入情况

返回结果

任意操作数为NaN

NaN

lhs为正负无穷,或rhs为正负零

NaN

lhs为有限数,rhs为正负无穷

lhs,保留其符号

lhs为正负零,rhs非零且非NaN

与lhs同符号的零

有限输入能够整除,且rhs非零

与lhs同符号的零

调用示例#

import pypto_pro.language as pl

THREADS = 128


@pl.vector_function(mode="simt", max_threads=THREADS)
def calculate_remainder(
    lhs: pl.Tensor[[1, THREADS], pl.DT_FP32],
    rhs: pl.Tensor[[1, THREADS], pl.DT_FP32],
    output: pl.Tensor[[1, THREADS], pl.DT_FP32],
):
    tid = pl.simt.linear_thread_idx()
    output[0, tid] = pl.simt.fmod(lhs[0, tid], rhs[0, tid])


@pl.jit()
def simt_fmod_kernel(
    lhs: pl.Tensor[[1, THREADS], pl.DT_FP32],
    rhs: pl.Tensor[[1, THREADS], pl.DT_FP32],
    output: pl.Tensor[[1, THREADS], pl.DT_FP32],
):
    with pl.section_vector():
        calculate_remainder[THREADS](lhs, rhs, output)