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