【问题标题】:Does the cuda math function norm3df overflow?cuda 数学函数 norm3df 是否溢出?
【发布时间】:2016-02-17 13:10:56
【问题描述】:

我正在 cuda 中开发一个 nbody 模拟器。我想使用浮点类型来提高速度,但这使我的任务变得困难。我担心的是说我有一个向量 并且我想使用勾股定理计算它的大小。我必须对每个 10^40 的组件进行平方,在 32 位中这将是无穷大。因此,即使我取和的平方根时的最终结果在范围内,中间步骤也会溢出。我在 cuda 数学 API 中遇到了以下函数。 norm3df(x, y, z)。这会防止我正在谈论的中间步骤溢出吗?此外,我可能需要在主机和设备上使用此功能。行为是否相同?

【问题讨论】:

  • 什么会阻止您自己测试它?它实际上是 20 行代码...
  • 标准C/C++函数hypot()以及CUDA的附加函数rhypot()norm3d()rnorm3d()的目的正是为了避免在中间计算。由于rhypot()norm3d()rnorm3d() 不是标准C/C++ 库的一部分,您将无法在宿主代码中使用它们。您可能想建议您的主机编译器供应商将这些函数作为专有扩展添加。
  • @njuffa 可能可以作为答案。 FWIW 我使用norm3df() 测试了建议的测试用例,它给出了173205081561134792704.0 的正确答案。如果不存在主机实现,我很好奇为什么该函数在头文件和文档中都被标记为__host__ __device__。我也很好奇norm3d 如何避免中间溢出。它是否对double 算法使用了某种扩展?
  • 我假设它是在硬件中实现的,以避免 GPU 上的溢出。我也想知道为什么它被标记为 host 因为我无法链接它。
  • 正如之前在另一个线程(此处或 NVIDIA 论坛)中讨论的那样,CUDA 头文件中似乎有一些函数被错误地标记为 __host__ __device__,可能是由于剪切和粘贴。我没有尝试在主机代码中调用norm3d(),但我认为不存在主机版本。防止中间溢出/下溢的技术是重新调整操作数以及使用实际计算的巧妙转换。不需要更高的中间结果精度。详情见math_functions.hmath_functions_dbl_ptx3.h的CUDA 6.5版本中的源码

标签: c++ cuda floating-point


【解决方案1】:

标准 C++ 数学库包含一个函数 hypot(),用于计算 2D 范数同时避免中间计算中的过早下溢和上溢。因为也经常遇到 3D 范数,所以 CUDA 数学库还提供了一个类似的函数 norm3d()。 CUDA math API documentation 中的描述如下:

计算三维向量p在欧几里得空间中的长度 没有过度的上溢或下溢

此外,CUDA 数学库提供了倒数范数函数 rhypot()rnorm3d(),这在规范化 2D 和 3D 向量时很有用,因为它们允许用更便宜的乘法代替昂贵的除法。

由于 norm3d()rhypot()rnorm3d() 不是标准 C++ 数学库函数,它们不能用于 CUDA 程序的主机部分,因为主机代码由主机工具链处理。 NVIDIA 为设备提供数学库支持。您可能需要向主机工具链的供应商提交增强请求,以将这些有用的功能添加为专有扩展,和/或游说 ISO C/C++ 委员会将它们添加到标准的未来版本中。

我之前注意到,当前发布的 CUDA 头文件似乎错误地将 normd3d() 和其他一些 CUDA 特定函数标记为 __host__ __device__,尽管实际上没有主机实现。这似乎是一个错误,可能是由于将这些属性剪切和过去应用到原型而引起的。

范数和倒数范数函数在其内部计算中不需要更高的中间精度,这意味着对具有低吞吐量双精度的 GPU 没有负面的性能影响。相反,他们使用巧妙的数学重新排列、操作数的重新缩放以及使用 FMA 来实现他们的目标。它们不仅可以防止过度的上溢和下溢,还应该比等效的幼稚计算更准确。

在 CUDA 6.5 版之前(包括在内),CUDA 数学库的实现细节在 CUDA 头文件 math_functions.hmath_functions_dbl_ptx3.h 中可见,因此任何想更好地了解规范函数内部细节​​的人可能想看看那里。

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2011-09-23
    相关资源
    最近更新 更多