问题或多或少都说明了一切.
calling a host function("std::pow<int, int> ") from a __device__/__global__ function("_calc_psd") is not allowed
从我的理解,这应该是使用cuda pow功能,但事实并非如此.
解决方法:
该错误与报告编译器完全一样.您不能在设备代码中使用主机功能,并且包括整个主机C std库. 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是一个相当昂贵的函数,我确信一些级联整数乘法会更快).