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

时间:2018-03-23 14:32:37

标签: 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);

float r = erff(0.1f);

似乎工作。这是一个缺少的实现吗?

1 个答案:

答案 0 :(得分:1)

不完全是答案,而是对你的前提的挑战。 float r = erff(0.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()

__global__ void dummy()
{
    float r = erff(0.1f);
    printf("Result of erf is (as double) %lf\n", (double) r);
}

你得到大约20行,12个左右的实际指令。在我的书中仍然没有constexpr计算。