微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

| 问题或多或少说明了一切。
calling a host function(\"std::pow<int,int> \") from a __device__/__global__ function(\"_calc_psd\") is not allowed
据我了解,这应该改为使用cuda pow函数,但事实并非如此。     

解决方法

该错误与编译器报告的完全相同。您不能在设备代码中使用主机功能,这些功能包括整个主机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传递float或double参数吗?如果传递整数,则CUDA标准库中没有重载函数,这就是为什么它可能会失败的原因。如果需要整数pow函数,则必须自己滚动(或进行强制转换,但是pow是相当昂贵的函数,我敢肯定,某些​​级联整数乘法会更快)。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。