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

Bol*_*ter 4 python cuda pow pycuda

问题或多或少都说明了一切.

calling a host function("std::pow<int, int> ") from a __device__/__global__ function("_calc_psd") is not allowed
Run Code Online (Sandbox Code Playgroud)

从我的理解,这应该是使用cuda pow功能,但事实并非如此.

tal*_*ies 6

该错误与报告编译器完全一样.您不能在设备代码中使用主机功能,并且包括整个主机C++标准库.CUDA包含自己的标准库,在编程指南中有描述,但你应该使用pow或fpow(取自C标准库,没有C++或命名空间).nvcc将使用cuda正确的设备函数重载该函数并内联生成的代码.以下内容将起作用:

#include <math.h>

__device__ float func(float x) {

   return x * x * fpow(x, 0.123456f);
}
Run Code Online (Sandbox Code Playgroud)

编辑:我第一次错过的位是错误中报告的模板说明符.你确定你要将浮动或双重参数传递给pow吗?如果传递整数,则CUDA标准库中没有重载函数,这就是它可能失败的原因.如果你需要一个整数pow函数,你将不得不自己滚动(或者进行转换,但pow是一个相当昂贵的函数,我确信一些级联整数乘法会更快).