在 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 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)