我一直在努力寻找有关在图形硬件上使用float vs double的性能的信息。我已经在CPU上找到了关于浮点数和双倍数的大量信息,但是对于GPU来说这样的信息更加稀缺。
我使用OpenGL进行编码,因此,如果您认为应该知道该API的任何特定信息,那就让我们知道吧。
据我所知,如果程序将大量数据移入/移出图形硬件,那么使用浮点数可能会更好,因为双倍需要两倍的带宽。我的询问更多的是图形硬件如何处理它。据我所知,现代英特尔CPU将浮点/双精度转换为80位实数进行计算(不包括SSE指令),因此这两种类型的速度同样快。现代显卡做这样的事吗?浮动和双重表现现在大致相等?是否有任何强有力的理由使用其中一个?
答案 0 :(得分:23)
就速度而言,GPU针对浮点数进行了优化。我对Nvidia硬件更为熟悉,但在目前的硬件中,每8个SP FPU有1个DP FPU。在下一代硬件中,它们预计会有更多的1比2的比例。
我的建议是看你的算法是否需要双精度。许多算法并不真正需要额外的位。运行一些测试以确定通过单精度获得的平均误差,并确定它是否重要。如果没有,只需使用单身。
如果您的算法纯粹用于图形,则可能不需要双精度。如果您正在进行通用计算,请考虑使用OpenCL或CUDA。
答案 1 :(得分:5)
现代图形卡可以进行许多优化,例如:它们甚至可以在24位浮点数上运行。据我所知,内部显卡不使用双打,因为它们是为速度而制作的,不一定是精确的。
来自维基百科上GPGPU的条目:
Nvidia GPU上浮点的实现主要是IEEE兼容的;但是,并非所有供应商都这样做。这对正确性有影响,这对于某些科学应用来说是重要的。虽然CPU上通常可以使用64位浮点值(双精度浮点数),但GPU并不普遍支持这些值。一些GPU架构牺牲了IEEE兼容性,而其他架构则完全缺乏双精度。已经努力在GPU上模拟双精度浮点值;然而,速度权衡取消了首先将计算卸载到GPU上的任何好处。
答案 2 :(得分:4)
大多数GPU根本不支持双浮点数。最近(这一代)增加了支持,而不是到处都是:
对于其他一切,你只是没有双重支持。
所以......如果你不需要,你绝对不应该使用双倍。
答案 3 :(得分:3)
DX11之前不支持双打渲染:(即Shader Model 5)
http://msdn.microsoft.com/en-us/library/ee418354(VS.85).aspx
我怀疑OpenGL会是一样的。