Cuda 带负号的fma中每个周期的指令数是多少?

Cuda 带负号的fma中每个周期的指令数是多少?,cuda,fma,Cuda,Fma,如果我在cuda中使用fma(a,b,c),这意味着公式ab+c是在单个三元运算中计算的。但是,如果我想计算-ab+c,调用fma(-a,b,c)是否还要进行一次乘法运算?不幸的是,着色器汇编语言在该级别没有文档记录 但是,我们可以尝试: #!/bin/bash cat <<EOF > fmatest.cu __global__ void fma_plus(float *res, float a, float b, float c) { *res = fma(a, b,

如果我在cuda中使用fma(a,b,c),这意味着公式ab+c是在单个三元运算中计算的。但是,如果我想计算-ab+c,调用fma(-a,b,c)是否还要进行一次乘法运算?

不幸的是,着色器汇编语言在该级别没有文档记录

但是,我们可以尝试:

#!/bin/bash
cat <<EOF > fmatest.cu
__global__ void fma_plus(float *res, float a, float b, float c)
{
    *res = fma(a, b, c);
}

__global__ void fma_minus(float *res, float a, float b, float c)
{
    *res = fma(-a, b, c);
}
EOF
nvcc -arch sm_60 -c fmatest.cu
cuobjdump -sass fmatest.o
因此,FFMA指令确实可以使用附加符号应用于产品(请注意,它在着色器汇编指令中应用于b,但这会给出相同的结果)。
您也可以尝试使用双精度操作数和其他计算功能,而不是
sm_60
,这将提供类似的结果。

不幸的是,着色器汇编语言在该级别没有文档记录

但是,我们可以尝试:

#!/bin/bash
cat <<EOF > fmatest.cu
__global__ void fma_plus(float *res, float a, float b, float c)
{
    *res = fma(a, b, c);
}

__global__ void fma_minus(float *res, float a, float b, float c)
{
    *res = fma(-a, b, c);
}
EOF
nvcc -arch sm_60 -c fmatest.cu
cuobjdump -sass fmatest.o
因此,FFMA指令确实可以使用附加符号应用于产品(请注意,它在着色器汇编指令中应用于b,但这会给出相同的结果)。
您也可以尝试使用双精度操作数和其他计算功能,而不是
sm_60
,这将提供类似的结果。

由于汇编语言表示法的限制(对于
FNMA
,没有单独的助记符),乘积
a*b
的求反始终显示为反汇编代码中
b
操作数的求反。由于汇编语言表示的限制(对于
FNMA
没有单独的助记符),乘积
a*b
的求反始终显示为反汇编代码中
b
操作数的求反。