优化 – 乘法和加法函数

这个问题是关于OpenCL中可用的疯狂函数,它承诺对类型的计算进行重大改进:

a * b c

如果用作疯狂(a,b,c)并使用cl-mad-enable编译.

我已经尝试使用mad来计算形式为b * c d * e的非常大的尺寸,并期待显着的改进.令人惊讶的是,它花了相同的时间.

如果有人有这方面的经验,我将不胜感激.我有一个jist它应该工作,因为大多数资源都充满了对mad()的赞美.注意:我使用的数据类型都是双倍的,如果它很重要,我对mad的使用会导致v.巨大的精度损失.

最佳答案 (1)能够处理双打和能够有效处理双精度之间存在很大差异.最新的GPU处理双倍,但比单精度慢大约2X-4X.

但是,AFAIK处理double的所有GPU都有疯狂的指令. AMD记录了这一点 – 例如参见http://developer.amd.com/gpu_assets/r600isa.pdf,日期为2008年的MULADD_64指令.我见过Nvidia的详细文档较少,但像http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/Floating_Point_on_NVIDIA_GPU_White_Paper.pdf这样的文档说Nvidia有FMA(Fused Multiply Add).英特尔GPU手册www.x.org/docs/intel没有提到双精度(至少不是谷歌).

(2)但是,使用madd()时可能是你看到没有区别的主要原因是编译器已经认识到可以使用madd.

在某些GPU上,您可以查看生成的代码.例如.用于OpenGL代码的AMD CodeAnalyst或ShaderAnalyzer,http://developer.amd.com/tools/shader/Pages/default.aspx.

我花了很多时间查看使用这些工具生成的代码,而IIRC则进行了优化.待定:在这里展示一个例子.

点赞