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