这个问题是关于OpenCL中可用的mad函数的,这些函数承诺对类型的计算进行显著改进
a * b + c
如果用作CCD_ 1并使用cl-mad-enable编译。
我已经尝试过使用mad对非常大的尺寸进行形式a + b * c + d * e
的计算,并期望有显著的改进。令人惊讶的是,花了同样的时间。
如果有人对此有经验,我将不胜感激。我认为它应该有效,因为大多数资源都对mad()
赞不绝口。注意:我使用的数据类型都是双精度的,如果重要的话,我使用mad
会导致v.巨大的精度损失。
-
能够处理双倍精度和能够有效地处理双倍精度之间有很大的区别。最新的GPU处理双精度,但比单精度慢约2X-4X。
然而,AFAIK所有处理double的GPU都有madd指令。AMD对此进行了记录——例如,参见2008年发布的R600系列ISA MULADD_64指令。我看到的Nvidia的文档不太详细,但Nvidia GPU的浮点等文档说Nvidia有FMA(Fused Multiply Add)。有关英特尔GPU的手册,请访问https://www.x.org/docs/intel/不要提及双精度(至少不要提及谷歌)。
-
然而,在使用madd()时,您看到没有差异的主要原因可能是编译器已经认识到可以使用madd。
在一些GPU上,您可以查看生成的代码;例如用于OpenGL代码的AMD CodeAnalyst或AMD GPU ShaderAnalyzer。
我花了很多时间研究用这些工具生成的代码,并对IIRC进行了优化。TBD:在这里展示一个例子。