是否可以像__host__
函数一样调用pyCUDA
中的__global__
个函数?我在文档中注意到pycuda.driver.Function
创建了__global__
函数的句柄。可以从__device__
函数调用__global__
个函数,但__host__
代码不能。我知道使用__host__
函数几乎违背了pyCUDA
的目的,但是有一些已经制作的函数我想导入并调用作为概念证明
作为一个注释,每当我尝试导入__host__
函数时,我都会得到:
pycuda._driver.LogicError: cuModuleGetFunction failed: named symbol not found
答案 0 :(得分:1)
不,不可能。
这不是PyCUDA本身的限制,而是CUDA本身的限制。 __host__
装饰器只是衰减到普通的主机代码,而CUDA API没有也不能像处理设备代码那样处理它们(注意API也不能处理__device__
或者,这是__host__
}的真正等价物。
如果要从Python调用/使用__host__
函数,则需要使用标准的C ++ / Python互操作机制之一,如ctypes或SWIG或boost python等。
答案 1 :(得分:0)
下面,我提供了一个示例代码来调用CUDA API
中的pyCUDA
。该代码会生成均匀分布的随机数,并可作为在CUDA API
代码中包含已经实现的功能(如发帖人所说的pyCUDA
之类)的参考。>
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)