单精度浮点的意义

机器算法验证 r Python 显卡
2022-03-08 06:27:41

我一直在查看处理 GPU 计算的高性能任务视图中的一些包,并且鉴于大多数 GPU 在执行单精度算术方面似乎DP 强一个数量级,我想知道:

  1. 为什么没有一个包给用户更多的控制所需的精度类型?我可以看到许多统计应用,其中 SP 算术(即以 7 位精度编码的数字)足以满足实际使用(如果我高估了所涉及的收益,请告诉我)。
  2. Python 在这方面更灵活吗?如果是这样,为什么?我不明白为什么 R 中缺少“单一”类型会使得在 GPUtools 或 magma 中包含这样的选项(连同警告)是不可能的(尽管我很乐意被显示错误)。

PS:我特别考虑的是数字已经按维度缩放和居中(因此切比雪夫不等式具有约束力)维度的应用程序。

4个回答
  1. 因为在 GPU 之前,使用单实数没有实际意义;你永远不会有太多的准确性,记忆通常不是问题。并且仅支持双打使 R 设计更简单。(尽管 R 支持读/写单个实数。)
  2. 是的,因为 Python 旨在与编译语言更加兼容。然而,您是对的,R 库的包装器可以进行动态转换(这当然需要时间,但这是一个小问题);您可以尝试向 GPU 包的维护者发送电子邮件请求此类更改。

GPUtools 帮助文件中,这似乎useSingle=TRUE是函数的默认值。

我认为通过 GPU 编程,您的意思是对 nvidia 卡进行编程?在这种情况下,来自 R 和 python 的底层代码调用是对 C/ CUDA的。


仅提供单精度的简单原因是因为大多数 GPU 卡都支持单精度。

但是,新的 nvidia Fermi架构确实支持双精度。如果你今年买了个英伟达显卡,那它很可能是费米。即使在这里,事情也不简单:

  • 如果您以双精度编译(如果我没记错的话是两倍),您会受到轻微的性能影响。
  • 在更便宜的卡费米卡上,nvidia 故意禁用双精度。但是,可以绕过这个并运行双精度程序。我设法在 linux 下的 GeForce GTX 465 上做到了这一点。

要回答标题中的问题“单精度可以吗?”,这取决于您的应用程序(抱歉,废话回答!)。我想现在每个人都使用双精度,因为它不再影响性能。

当我涉足 GPU 时,编程突然变得复杂得多。您必须担心以下事情:

  • warpsize 和正确安排你的记忆。
  • #每个内核的线程数。
  • 调试很糟糕——GPU 内核语句中没有打印语句
  • 缺少随机数生成器
  • 单精度。

流通中的绝大多数 GPU 仅支持单精度浮点。

至于标题问题,您需要查看您将要处理的数据,以确定单精度是否足以满足您的需求。通常,您会发现,对于您处理的 >90% 的数据,单项数据完全可以接受,但对于最后 10% 的数据,您将完全失败;除非您有一种简单的方法来确定您的特定数据集是否会失败,否则您将无法对所有内容使用双精度。