我对使用HLSL在GPU上实现算法很感兴趣,但我主要担心的是我想要一个可变级别的精度。是否存在可以在GPU上实现64位精度和更高精度的技术。
谢谢!
答案 0 :(得分:10)
GPU刚刚开始支持硬件的双精度,但在不久的将来它将继续比单精度慢得多。多年来已经开发出各种各样的技术来使用由具有快速硬件支持的任何精度的多个浮点组成的表示来合成更高精度的浮点,但是开销非常大。 IIRC,crlibm手册对其中一些技术进行了很好的讨论,包括错误分析和伪代码(CRLIBM使用它们将数字表示为多个双精度值,但相同的技术可以单独使用)
如果不了解您正在尝试做的事情,很难给出更好的答案。对于某些算法,只有一小部分计算需要高精度;如果你遇到这样的情况,你可能会在GPU上获得不错的性能,尽管代码不一定非常漂亮或易于使用。如果您在整个算法中普遍需要高精度,那么GPU目前可能不适合您。
最后,为什么HLSL而不是像CUDA或OpenCL这样的面向计算的语言?
答案 1 :(得分:5)
使用两个浮点数(即单精度值),可以实现大约56位的精度。这接近double的精度,但是你可以为这种“双单”数据类型实现的许多操作都很慢,并且不如使用双精度那么精确。但是,对于简单的算术运算,它们通常就足够了。
这个paper讨论了这个想法,并描述了如何实现乘法运算。有关您可以执行的操作以及如何实现它们的更完整列表,请查看DSFUN90软件包here。该包使用Fortran 90编写,但可以转换为具有单精度数字的任何内容。请注意,您必须从中许可库以将其用于商业目的。我相信Mersenne-Twister CUDA演示应用程序还具有添加和乘法操作的实现。
答案 2 :(得分:2)
这是一个稍微偏离主题的答案,但是如果你想通过将一些操作切换到单精度算术来看看你的问题将如何受到影响,你应该考虑使用区间算术当您以各种方式混合精度时,以经验方式测量不确定性边界。 Boost 有一个区间运算库,我曾经用它来检测现有的C ++科学代码:它很容易使用。
但要注意:区间算术是出了名的悲观:即它有时会夸大边界。仿射算法应该更好,但我从来没有找到一个可用的库。
答案 3 :(得分:0)
ATI的Stream SDK支持一些本机双精度,但它不是HLSL。
捕获量是:
OpenCL将支持双精度作为扩展,但仍处于测试阶段。