乘法和添加函数

时间:2012-02-24 00:43:48

标签: optimization gpu

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

a * b + c

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

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

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

1 个答案:

答案 0 :(得分:2)

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

然而,AFAIK处理double的所有GPU都有疯狂的指令。 AMD记录了这一点 - 例如请参阅2008年http://developer.amd.com/gpu_assets/r600isa.pdf,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则进行了优化。待定:在这里展示一个例子。