【问题标题】:__host__ __device__ functions calling overloaded functions__host__ __device__ 函数调用重载函数
【发布时间】:2020-07-18 08:54:27
【问题描述】:

我不明白 Cuda 中是否存在函数重载。我想在以下两个函数上解释我的问题,我希望能够在 GPU 和 CPU 上都使用,并且我不在乎精度:

__host__ __device__
float myabs( float v ) {
    return abs( v + 1 ); //I want the floating point absolute value
}

__host__ __device__
float mycos( float v ) {
    return 2.f*cos( v );
}
  1. abs 分别是哪个函数我应该打电话给cos,为什么?
    • std::abs / abs / fabs / fabsf / anythingelse
    • std::cos / cos / cosf / __cosf / anythingelse

(由于 __cosf 是 Cuda 固有的,而 std::abs/std::cos 在 Cuda 中不可用,我假设我必须在我的函数中使用预处理器指令来进行这些选择。)

  1. 我应该包含哪些标题?

  2. 前两个问题的答案是否取决于我是否使用快速数学标志进行编译(例如-ffast-math)。

如果这对答案很重要,我正在 Ubuntu 18.04.4 下使用 nvcc 10.2 进行编译。,但我对独立于平台的答案很感兴趣。 p>

【问题讨论】:

  • __cosf 是“快速”的近似版本。您可以在文档中查看其准确性。 ret 有点清楚。函数名中的最后一个f 是告诉它是浮点数而不是双精度数,否则代码(我认为)将转换为双精度,计算并将结果转换为浮点数。不确定编译器是否会捕获并修复它。编译器替换对fabs 有意义,不确定是否适用于cos

标签: cuda overloading fast-math


【解决方案1】:
  1. abs 的哪个功能,resp。因为我应该打电话给我,为什么?

如果您使用浮点参数,那么通常您会使用fabscosf。这些是standard CUDA Math API implementations(它们对应于等效的 C 标准库函数的名称)。

  1. 我应该包含哪些标题?

通常您应该包含math.hcmath

  1. 前两个问题的答案是否取决于我是否使用快速数学标志(例如 -ffast-math)进行编译。

没有。这些函数都不是 substituted 用于快速数学的快速内在函数。

【讨论】:

  • 我有两个问题:1)在cmath 中没有声明函数sinf ,那么它是如何工作的。 2)我读到带有标志 --fast-math 的 nvcc 将 sin 转换为 __sinf (这对我来说没有意义,因为 sin 需要双打而 __sinf 需要浮动)。
  • 不是你问过 sinf,而是从 c++11 开始它是 cmath 的一部分。
  • nvcc 没有编译器标志 --fast-math。如果您指的是--use_fast_math,则该行为记录在here 中,并且它对sin 没有影响,只有sinf
  • @talonmies 我查看了各种来源,它们都略有不同。根据 cppreference.com 有 std::sinf,根据 cplusplus.com 有 sin,根据我的标题 有 std::sin,根据 docs.microsoft.com 有 sinf。那么什么是正确/错误的。应该怎么样?
猜你喜欢
  • 2020-10-29
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多