4

这个问题是关于 OpenCL 中可用的 mad 函数,它们承诺显着改进类型的计算:

a * b + c

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

我已经尝试a + b * c + d * e使用 mad 对非常大的尺寸进行计算,并期待有显着的改进。令人惊讶的是,它花了同样的时间。

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

4

1 回答 1

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

    但是,AFAIK 所有处理双精度的 GPU 都有 madd 指令。AMD 记录了这一点 - 例如,参见R600-Family ISA,日期为 2008 年,MULADD_64 指令。我看到 Nvidia 的文档不太详细,但像NVIDIA GPU 的浮点这样的文档说 Nvidia 有 FMA(Fused Multiply Add)。https://www.x.org/docs/intel/上的英特尔 GPU 手册没有提到双精度(至少谷歌没有提到)。

  2. 但是,您在使用 madd() 时没有看到任何差异的主要原因可能是编译器已经认识到可以使用 madd。

    在某些 GPU 上,您可以查看生成的代码;例如用于 OpenGL 代码的AMD CodeAnalyst 或 AMD GPU ShaderAnalyzer 。

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

于 2012-04-21T06:07:33.577 回答