2012-02-24 125 views
4

这个问题是关于其承诺显著改善该类型的计算OpenCL中可用的疯狂功能:乘法和加法功能

A * B + C

如果用作狂(A,B,C )并使用cl-mad-enable进行编译。

我已经试过了一个计算形式a + b * c + d * e使用疯狂的一个非常巨大的大小,并期待着显着的改善。令人惊讶的是,它花了相同的时间。

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

+1

您的GPU实际上是否支持双打?他们中的很多只支持浮动。 – 2012-02-24 00:51:37

+0

不是默认情况下,但通过启用cl_khr_fp64,我可以使用它们。你可能有一点,我会转换为浮动和检查。由于代码非常大,需要一些时间。一旦我有什么,我会回应评论。 – 2012-02-24 08:41:08

回答

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上,您可以查看生成的代码。例如。 AMD CodeAnalyst或ShaderAnalyzer,用于OpenGL代码的http://developer.amd.com/tools/shader/Pages/default.aspx

我花了很多时间查看使用这些工具生成的代码,并对它进行了优化。 TBD:在这里展示一个例子。