PyCUDA:设备代码中的Pow尝试使用std :: pow,失败

5
问题基本上已经说得很清楚了。
calling a host function("std::pow<int, int> ") from a __device__/__global__ function("_calc_psd") is not allowed

据我理解,这应该使用cuda pow函数,但实际上没有使用。
1个回答

7

错误就像编译器所报告的那样。您不能在设备代码中使用主机函数,包括整个主机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是一个相当昂贵的函数,我确信一些级联整数乘法会更快)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接