【发布时间】: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 );
}
-
abs分别是哪个函数我应该打电话给cos,为什么?-
std::abs/abs/fabs/fabsf/anythingelse -
std::cos/cos/cosf/__cosf/anythingelse
-
(由于 __cosf 是 Cuda 固有的,而 std::abs/std::cos 在 Cuda 中不可用,我假设我必须在我的函数中使用预处理器指令来进行这些选择。)
我应该包含哪些标题?
前两个问题的答案是否取决于我是否使用快速数学标志进行编译(例如
-ffast-math)。
如果这对答案很重要,我正在 Ubuntu 18.04.4 下使用 nvcc 10.2 进行编译。,但我对独立于平台的答案很感兴趣。 p>
【问题讨论】:
-
__cosf是“快速”的近似版本。您可以在文档中查看其准确性。 ret 有点清楚。函数名中的最后一个f是告诉它是浮点数而不是双精度数,否则代码(我认为)将转换为双精度,计算并将结果转换为浮点数。不确定编译器是否会捕获并修复它。编译器替换对fabs有意义,不确定是否适用于cos。
标签: cuda overloading fast-math