【问题标题】:Calling __host__ functions in PyCUDA在 PyCUDA 中调用 __host__ 函数
【发布时间】:2019-04-02 02:20:55
【问题描述】:

是否可以像 __global__ 函数一样在 pyCUDA 中调用 __host__ 函数?我在文档中注意到pycuda.driver.Function 创建了一个__global__ 函数的句柄。 __device__ 函数可以从 __global__ 函数调用,但 __host__ 代码不能。我知道使用__host__ 函数在很大程度上违背了pyCUDA 的目的,但是我想导入并调用一些已经生成的函数作为概念证明。

请注意,每当我尝试导入 __host__ 函数时,我都会得到:

pycuda._driver.LogicError: cuModuleGetFunction failed: named symbol not found

【问题讨论】:

    标签: python pycuda


    【解决方案1】:

    不,这是不可能的。

    这不是 PyCUDA 本身的限制,而是 CUDA 本身的限制。 __host__ 装饰器只是衰减为纯主机代码,而 CUDA API 不会也不能以与处理设备代码相同的方式处理它们(注意 API 也不处理 __device__,这是__host__的真正等价物。

    如果您想从 Python 调用/使用 __host__ 函数,您将需要使用标准 C++/Python 互操作性机制之一,如 ctypes 或 SWIG 或 boost python 等。

    【讨论】:

      【解决方案2】:

      下面,我提供了一个示例代码,用于在pyCUDA 中调用CUDA APIs。该代码生成均匀分布的随机数,并可作为参考,以在pyCUDA 代码中包含已经创建的函数(如海报所说,并喜欢CUDA APIs)。

      import numpy             as np
      import ctypes
      
      import pycuda.driver      as drv
      import pycuda.gpuarray    as gpuarray
      import pycuda.autoinit
      
      curand = CDLL("/usr/local/cuda/lib64/libcurand.so")
      
      # --- Number of elements to generate
      N = 10
      
      # --- cuRAND enums
      CURAND_RNG_PSEUDO_DEFAULT    = 100
      
      # --- Query the cuRAND version
      i = c_ulonglong()
      curand.curandGetVersion(byref(i))
      print("curand version: ", i.value)
      
      # --- Allocate space for generation
      d_x = gpuarray.empty(N, dtype = np.float32)
      
      # --- Create random number generator
      gen = c_ulonglong()
      curand.curandCreateGenerator(byref(gen), CURAND_RNG_PSEUDO_DEFAULT)
      
      # --- Generate random numbers
      curand.curandGenerateUniform(gen, ctypes.cast(d_x.ptr, POINTER(c_float)), N)
      
      print(d_x)
      

      【讨论】:

        猜你喜欢
        • 2020-10-29
        • 2021-08-30
        • 1970-01-01
        • 2020-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多