在PyCUDA中调用__host__函数

问题描述 投票:1回答:2

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

请注意,每当我尝试导入__host__函数时,我得到:

pycuda._driver.LogicError: cuModuleGetFunction failed: named symbol not found
python pycuda
2个回答
1
投票

不,这是不可能的。

这不是PyCUDA本身的限制,而是CUDA本身的限制。 __host__装饰器只是衰减到普通的主机代码,而CUDA API没有也不能像处理设备代码那样处理它们(请注意,API也不能处理__device__,这是真正的等价物of __host__)。

如果你想从Python调用/使用__host__函数,你需要使用标准的C ++ / Python互操作机制之一,比如ctypes或SWIG或boost python等。


0
投票

下面,我提供了一个示例代码,用于在CUDA API中调用pyCUDAs。代码生成均匀分布的随机数,并且可以作为参考,在CUDA API代码中包括已经制作的函数(如海报所说,并且像pyCUDAs一样)。

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)
© www.soinside.com 2019 - 2024. All rights reserved.