如何使用PyCUDA的“prepare”函数

如何使用PyCUDA的“prepare”函数,cuda,pycuda,Cuda,Pycuda,我无法将正确的参数传递给(以及准备好的_调用)。我以这种方式理解错误消息,我传递给PyCUDA的变量之一是long,而不是我想要的float32。但我看不到,变量来自哪里 此外,在我看来,关于块是否需要无的问题,和似乎相互矛盾 from pycuda import driver, compiler, gpuarray, tools import pycuda.autoinit import numpy as np kernel_code =""" __device__ void loadVec

我无法将正确的参数传递给(以及准备好的_调用)。我以这种方式理解错误消息,我传递给PyCUDA的变量之一是
long
,而不是我想要的
float32
。但我看不到,变量来自哪里

此外,在我看来,关于
是否需要
的问题,和似乎相互矛盾

from pycuda import driver, compiler, gpuarray, tools
import pycuda.autoinit
import numpy as np

kernel_code ="""
__device__ void loadVector(float *target, float* source, int dimensions )
{
    for( int i = 0; i < dimensions; i++ ) target[i] = source[i];
}
__global__ void kernel(float* data, int dimensions, float* debug)
{
    extern __shared__ float mean[];
    if(threadIdx.x == 0) loadVector( mean, &data[0], dimensions );
    debug[threadIdx.x]=  mean[threadIdx.x];
}
"""

dimensions = 12
np.random.seed(23)
data = np.random.randn(dimensions).astype(np.float32)
data_gpu = gpuarray.to_gpu(data)
debug = gpuarray.zeros(dimensions, dtype=np.float32)

mod = compiler.SourceModule(kernel_code)
kernel = mod.get_function("kernel")
kernel.prepare("PiP",block = (dimensions, 1, 1),shared=data.size)
grid = (1,1)
kernel.prepared_call(grid,data_gpu,dimensions,debug)
print debug.get()
来自pycuda导入驱动程序、编译器、gpuarray、工具
导入pycuda.autoinit
将numpy作为np导入
内核_代码=”“”
__设备\无效加载向量(浮点*目标、浮点*源、整数维)
{
对于(inti=0;i
输出

Traceback (most recent call last):
File "shared_memory_minimal_example.py", line 28, in <module>
kernel.prepared_call(grid,data_gpu,dimensions,debug)
File "/usr/local/lib/python2.6/dist-packages/pycuda-0.94.2-py2.6-linux-x86_64.egg/pycuda/driver.py", line 230, in function_prepared_call
func.param_setv(0, pack(func.arg_format, *args))
pycuda._pvt_struct.error: cannot convert argument to long
回溯(最近一次呼叫最后一次):
文件“shared_memory_minimal_example.py”,第28行,在
准备好的调用(网格、数据、gpu、维度、调试)
文件“/usr/local/lib/python2.6/dist packages/pycuda-0.94.2-py2.6-linux-x86_64.egg/pycuda/driver.py”,第230行,在函数调用中
函数参数设置(0,包(函数参数格式,*args))
pycuda.\u pvt\u struct.error:无法将参数转换为long

我遇到了同样的问题,我花了一段时间才找到答案,现在开始。错误消息的原因是data_gpu是一个GPUArray实例,即您使用

data_gpu = gpuarray.to_gpu(data)
要将其传递给prepared_call,您需要执行data_gpu.gpudata以获取关联实例(即有效地指向设备内存位置的指针)

另外,现在将块参数传递给prepare是-因此正确的调用如下所示:

data_gpu = gpuarray.to_gpu(data)
func.prepare( "P" )
grid = (1,1)
block = (1,1,1)
func.prepared_call( grid, block, data_gpu.gpudata )

一个月前你发布了我给你的答案,其中解释了如何做。请更新问题,包括新的代码和信息。嗨,我更新了整个问题。谢谢你的病人。