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

时间:2011-04-13 22:48:37

标签: python cuda pow pycuda

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

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

从我的理解,这应该是使用cuda pow功能,但它不是。

1 个答案:

答案 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是一个相当昂贵的函数,我确定一些级联整数乘法会更快)。