[有奖问答]_mul24和FMA问题

cuda只支持24位整数乘法,一般情况下32位整数乘法是模拟出来的,所以速度比较慢。
但是我看到有一本书上说未来架构上_mul24将会比32bit整数乘更慢。
所以我想确定下在gf8800,G260和G295上是否还是应该把*改为_mul24比较好?还有_mul24相比×会多增加大约多少寄存器占用?

还有一般的GPU都支持fused multiply-add。这种支持是不是编译器会优化的,不需要我在code的时候关注。
就是说是不是我写d=a+b*c,编译器会自动将它转化成FMA指令?是不是最好看下PTX确定?

在G8x G9x GT2xx架构上__mul24仍然比较快,Fermi架构直接*快点
多用的寄存器数量不是很确定,肯定不会太多就是了
而且不一定会反映到最终的寄存器使用量上

FMA是硬件支持的,对程序员透明
GT200只支持对64bit浮点的FMA
Fermi才有32bit FMA

谢谢

在G200上是支持MAD指令的,同样问题
这种支持是不是编译器会优化的,不需要我在code的时候关注。
就是说是不是我写d=a+b*c,编译器会自动将它转化成MAD指令?

CUDA C编译器会自动做
OpenCL编译器要检查编译选项

乘加(MAD)指令对整数型有效吗?还是只对float有效?
形如__mul24( a,b) - c这类指令CUDA C编译器会优化吗?

应当不会,我记得默认是32位乘法的

Fermi有32bit整型乘加
打开use fast math编译选项后会尽量自动使用内建指令
但不包括__[u]mul24

原来如此,原来32bit整型乘加只有Fermi才有。
看在不能在G260/G295用整数乘加指令优化访问数组诸如A[a*b+c]的形式了。

http://cuda.itpub.net/thread-1320047-1-1.html
我看到PTX 1.0 ISA 有mad24.lo.u32这条指令的。这条指令不是整数的乘加指令吗?

这个,他做的是24位的

在ptx一级是已经封装过的ISA,而不是机器上真正执行的指令
ptx里mad指令和mad24指令都有
但是实际硬件并不一定有相应的乘加器

既然tesla架构上整型mad指令都是多条指令模拟的,那么原生的乘加当然更无从谈起了
Fermi上的mul24也是由多条指令模拟的,但是为了ptx前向兼容依然有这条语句

实测tesla架构的32bit整数乘加指令吞吐量是介于乘法和加法之间,而fermi架构上与乘法或者加法相同,就是证明
我没有实际测过mad24的吞吐量,应该是低于mul24或加法的,手册在介绍吞吐量的时候并没有专门列出24bit mad

[ 本帖最后由 NvidiaCTC 于 2010-7-1 21:45 编辑 ]

:ipride: 终于搞清楚了。非常感谢