在PyCUDA中调用__host__函数

时间:2017-07-06 17:25:42

标签: python pycuda

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

作为一个注释,每当我尝试导入__host__函数时,我都会得到:

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

2 个答案:

答案 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)