问题或多或少说明了一切。
calling a host function("std::pow<int, int> ") from a __device__/__global__ function("_calc_psd") is not allowed
据我了解,这应该使用 cuda pow 函数,但事实并非如此。
该错误与编译器报告的完全一样。您不能在设备代码中使用主机函数,包括整个主机 C++ 标准库。CUDA 包括其自己的标准库,如编程指南中所述,但您应该使用 pow 或 fpow(取自 C 标准库,没有 C++ 或命名空间)。nvcc 将使用 cuda 正确的设备函数重载该函数并内联生成的代码。像下面这样的东西会起作用:
#include <math.h>
__device__ float func(float x) {
return x * x * fpow(x, 0.123456f);
}
编辑:我第一次错过的是错误中报告的模板说明符。您确定将浮点或双参数传递给 pow 吗?如果您传递整数,CUDA 标准库中没有重载函数,这就是它可能失败的原因。如果您需要整数 pow 函数,则必须自己滚动(或进行强制转换,但 pow 是一个相当昂贵的函数,我确信一些级联整数乘法会更快)。