当我在设备代码中使用带有浮点的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);
似乎工作。这是一个缺少的实现吗?
答案 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计算。