CUDA中的双精度浮点

Posted

技术标签:

【中文标题】CUDA中的双精度浮点【英文标题】:Double precision floating point in CUDA 【发布时间】:2010-05-12 08:11:39 【问题描述】:

CUDA 是否支持双精度浮点数?

还有,同样的原因是什么?

【问题讨论】:

【参考方案1】:

如果你的 GPU 有 compute capability 1.3 那么你可以做双精度。您应该知道,虽然 1.3 硬件每个 MP 只有一个双精度 FP 单元,必须由该 MP 上的所有线程共享,而有 8 个单精度 FPU,因此每个活动线程都有自己的单精度 FPU。换句话说,您很可能会看到双精度的性能比单精度差 8 倍。

【讨论】:

感谢保罗的提示。我想切换到doubleprecision,主要是为了准确。我正在咨询一个将 Python 代码转换为 C++ / CUDA 的副项目,并且 Python 代码在任何地方都使用 double 精度。我注意到,当我切换到使用float 时,结果的最大绝对差异为1e-06。我对此不太满意,但我宁愿以准确性而不是性能来接受子弹。谢谢! +1。 哈 - 现在评论 7 岁的答案吗? ;-) 说真的,尽管现在这可能有点过时了——我已经有几年没玩过 CUDA 了,据我所知,最新的 nVidia 硬件现在可能有更好的双精度支持。 呵呵 我没注意到年份。在发表评论之前,我查看了该功能:)。我正在为我的客户开发的卡只有 3.0 的计算能力,它仍然只有单精度的一半。从 6.0 开始,它才得到全面支持……可惜。尽管如此,即使这已经 7 岁了,还是谢谢! 要考虑的另一件事是,如果 GPU 较旧,但 CPU 相当新(尤其是如果它具有大量内核),那么您可能会通过良好的 FFT 获得更好的结果CPU 上的库(例如 FFTW),这更容易实现和管理。不管怎样,祝你走哪条路好运! @Suparshva 啊,我明白了。不,我最后的第一条评论说“......但我宁愿以准确性而不是性能来接受子弹”......这意味着我最终使用了单精度。我也没有使用任何基于 FFT 的解决方案,因为我的特定用例不需要它(即使我确实在 2D 中实现了卷积)。【参考方案2】:

作为提示:

如果您想使用双精度,您必须将 GPU 架构设置为 sm_13(如果您的 GPU 支持的话)。

否则,它仍会将所有双精度数转换为浮点数并仅给出警告(如 faya 的帖子所示)。 (如果您因此遇到错误,非常烦人:-))

标志是:-arch=sm_13

【讨论】:

【参考方案3】:

继 Paul R 的 cmets 之后,Compute Capability 2.0 设备(又名 Fermi)大大改进了双精度支持,性能仅为单精度的一半。

这个Fermi whitepaper有更多关于新设备双重性能的细节。

【讨论】:

+1:感谢您提供的额外信息 - 我已经有大约一年没有使用 CUDA 了,也不知道 Compute Capability 2.0 - 技术领域的任何东西都不会保持很长时间!跨度> 请注意,尽管 GeForce 卡的 Fermi 双精度性能(人为地)低于 Teslas。 Quadro 卡应具有与 Tesla 卡相同的性能水平。 不幸的是,Quadro 卡的价格似乎是配备相应 GPU 的 GeForce 卡价格的 10 倍左右(尽管 Quadro 卡配备更多内存)。【参考方案4】:

正如其他人所说,较旧的 CUDA 卡不支持 double 类型。但是,如果您想要比旧 GPU 提供的精度更高的精度,您可以使用类似于double-double 技术的 float-float 解决方案。有关该技术的更多信息,请阅读

Emulate "double" using 2 "float"s Emulating FP64 with 2 FP32 on a GPU

当然,在现代 GPU 上,您也可以使用 double-double 来实现大于 double 的精度。 double-double 也用于long double on PowerPC

【讨论】:

以上是关于CUDA中的双精度浮点的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中将浮点数组转换为双精度数组?

返回没有尾随零的双精度类型

__saturatef() 内在函数没有等效的双精度

可以存储在 double 中的最大整数

如何在小数点后将 Dart 中的双精度数舍入到给定的精度?

比较 C++ 中的双精度,同行评审