Cuda 带负号的fma中每个周期的指令数是多少?
如果我在cuda中使用fma(a,b,c),这意味着公式ab+c是在单个三元运算中计算的。但是,如果我想计算-ab+c,调用fma(-a,b,c)是否还要进行一次乘法运算?不幸的是,着色器汇编语言在该级别没有文档记录 但是,我们可以尝试: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,
#!/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
操作数的求反。