在 PyCUDA 中调用 __host__ 函数
Calling __host__ functions in PyCUDA
是否可以像调用 __global__
函数那样在 pyCUDA
中调用 __host__
函数?我在文档中注意到 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__
两者之一,这是 __host__
).
的真正等价物
如果您想 call/use __host__
来自 Python 的功能,您将需要使用标准 C++/Python 互操作性机制之一,例如 ctypes 或 SWIG或提升 python,等等
下面,我提供了一个示例代码来调用 pyCUDA
中的 CUDA API
s。该代码生成均匀分布的随机数,可作为参考,以在 pyCUDA
代码中包含 已创建的函数 (如发帖者所说,并喜欢 CUDA API
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)
是否可以像调用 __global__
函数那样在 pyCUDA
中调用 __host__
函数?我在文档中注意到 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__
两者之一,这是 __host__
).
如果您想 call/use __host__
来自 Python 的功能,您将需要使用标准 C++/Python 互操作性机制之一,例如 ctypes 或 SWIG或提升 python,等等
下面,我提供了一个示例代码来调用 pyCUDA
中的 CUDA API
s。该代码生成均匀分布的随机数,可作为参考,以在 pyCUDA
代码中包含 已创建的函数 (如发帖者所说,并喜欢 CUDA API
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)