PyCUDA:设备代码中的Pow试图使用std::pow,但失败
这个问题基本上已经说得很清楚了。
calling a host function("std::pow<int, int> ") from a __device__/__global__ function("_calc_psd") is not allowed
根据我的理解,这里应该使用cuda的pow函数,但实际上并没有使用。
1 个回答
7
这个错误正如编译器所说的那样。你不能在设备代码中使用主机函数,这包括整个主机的C++标准库。CUDA有自己的标准库,这在编程指南中有说明,但你应该使用pow或fpow(这两个是来自C标准库的,不涉及C++或命名空间)。nvcc会用CUDA正确的设备函数来重载这个函数,并将生成的代码内联。像下面这样的代码是可以工作的:
#include <math.h>
__device__ float func(float x) {
return x * x * fpow(x, 0.123456f);
}
补充说明:我第一次没注意到错误中提到的模板说明符。你确定你传给pow的参数是float或double类型吗?如果你传的是整数,CUDA标准库里没有重载的函数,所以可能会导致失败。如果你需要一个整数的pow函数,你得自己写一个(或者进行类型转换,但pow函数比较耗时,我相信用一些连续的整数相乘会更快)。