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