【问题标题】:PyCUDA: Pow within device code tries to use std::pow, failsPyCUDA:设备代码中的 Pow 尝试使用 std::pow,失败
【发布时间】:2011-07-28 18:31:30
【问题描述】:

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

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

据我了解,这应该使用 cuda pow 函数,但事实并非如此。

【问题讨论】:

    标签: python cuda pow pycuda


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-05-22
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多