一位电气工程师最近提醒我不要使用GPU进行科学计算(例如准确性非常重要),因为没有像CPU那样的硬件保护措施。这是真的,如果是这样,典型硬件中的问题有多普遍/实质?
答案 0 :(得分:9)
实际上,现代GPU非常适合科学计算,并且为了性能和能效,许多HPC应用程序至少部分移植到GPU上运行。 与较旧的GPU不同,现代的GPU(例如采用NVIDIA的Fermi或Kepler架构)提供完全标准化的IEEE-754格式,无论是单精度还是双精度,因此您应该能够像在现代CPU上一样使用它们。
答案 1 :(得分:4)
我发现了一些(较旧的)论文,但似乎问题已经解决,计算能力> = 2.0。
当前的GPU不支持双精度计算及其 单精度支持掩盖了重要方面 IEEE-754浮点标准[1],如正确的舍入结果 并正确关闭号码系统。 ... 我们的结果表明GPU的结果存在严重错误 在某些边缘情况下,除了不正确的处理 非规范化数字。
Karl E. Hillesland和Anselmo Lastra,“GPU浮点偏执狂”。在Proc。 GP2,2004年8月。
Guillaume Da Graca和David Defour,“在图形上实现float-float操作符 硬件。“在Proc。第7届实数和计算机会议上,2006年7月。
双精度(CUDA计算能力1.3及以上)[14]偏离 来自IEEE 754标准:round-to-nearest-even是唯一的 支持倒数,除法和平方根的舍入模式。在 不支持单精度,非正规和信令NaN; 仅支持两种IEEE舍入模式(chop和round-to-nearest 偶数),这些是基于每个指令而不是 在控制字中;并且除法/平方根的精度是 略低于单精度。
答案 2 :(得分:2)
NVIDIA发布了一份白皮书,其中详细介绍了使用浮点和GPU的详细信息:
http://developer.download.nvidia.com/assets/cuda/files/NVIDIA-CUDA-Floating-Point.pdf
答案 3 :(得分:1)
实际上,大多数科学计算通常不需要那么准确,因为测量误差等很大程度上压倒了浮点舍入所引入的误差(除非可能在退化情况下,例如将一系列浮点数与相反的顺序,但即使在CPU中你也会遇到这类问题,因为它的设计工作正常,所以没有任何事情可以警告你。在科学计算中,通常足以在一定的误差范围内显示结果,并表明边际不会导致实际问题。
浮点设计速度快,不一定是精确的数字方式,即使在CPU中也是如此,这就是为什么我们总是教导我们将浮点数与epsilon进行比较。
OTOH,计算实际上需要精确的舍入规则到最后的数字,如会计或数论,应考虑使用定点算术(例如十进制模块),它允许您准确指定舍入规则。