Cuda 在设备代码中使用std::erf

Cuda 在设备代码中使用std::erf,cuda,std,Cuda,Std,当我在设备代码中使用std::erf时,使用的浮点值如下 float r = std::erf(0.1f); 我得到了错误的答案 calling a constexpr __host__ function("erfc") from a __device__ function is not allowed. 当 double r = std::erf(0.1); 或 似乎有效。这是一个缺失的实现吗?不完全是一个答案,而是对您的前提的挑战。浮点数r=erff0.1f;不太管用。也就是说,它可以

当我在设备代码中使用std::erf时,使用的浮点值如下

float r = std::erf(0.1f);
我得到了错误的答案

calling a constexpr __host__ function("erfc") from a __device__ function is not allowed.

double r = std::erf(0.1);


似乎有效。这是一个缺失的实现吗?

不完全是一个答案,而是对您的前提的挑战。浮点数r=erff0.1f;不太管用。也就是说,它可以编译,但您不能在编译时只得到一个立即值。我编辑了以下内容:

__global__ void dummy()
{
    double r = std::erf(0.1);
    printf("Result of erf is (as double) %lf\n", (double) r);
}
在生成的PTX中,我发现它编译成333行代码,包括注释、空行和.loc指令;我不告诉你那些肮脏的细节;这不是你所期望的。和CUDA'ish erff一起


你可以得到大约20行,12条左右的实际指令。在我的书中仍然不是constexpr计算。

你说的是主机代码,但这个错误是由于在_设备_函数中使用设备代码引起的。是哪一个?啊,对不起。我是说设备代码。更正在设备代码中,列出了支持的浮点实现,并列出了支持的双精度实现。CUDA设备数学api中的erf确实以double而不是floatMmm的形式提供。。Erf似乎支持CUDA设备数学API,但是我猜想它不是在C++ API中实现的。@ RobttRokVLLA:所以,CUDA数学API确实具有ERF和ErFF。那又有什么用?…@njuffa:对不起,我粘贴错了。
__global__ void dummy()
{
    double r = std::erf(0.1);
    printf("Result of erf is (as double) %lf\n", (double) r);
}
__global__ void dummy()
{
    float r = erff(0.1f);
    printf("Result of erf is (as double) %lf\n", (double) r);
}