【问题标题】:Multiply and Add Functions乘法和加法函数
【发布时间】:2012-03-15 03:04:54
【问题描述】:

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

a * b + c

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

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

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

【问题讨论】:

  • 你的 GPU 真的支持双打吗?其中很多只支持浮动。
  • 默认情况下不是,但通过启用 cl_khr_fp64,我可以使用它们。您可能有一点,我将转换为浮动并检查。由于代码很大,所以需要一些时间。有东西我会回复的。

标签: optimization gpu opencl fma


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

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

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

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

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

【讨论】:

  • 在 C 和 C++ 中,编译器不允许将 a*b + c 转换为 FMA 操作,因为这会产生不同的结果。用户必须显式调用madd
  • @phuclv 比这更复杂。参见标准宏FP_CONTRACT
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
相关资源
最近更新 更多