2011-08-05 3 views
3

올바른 매개 변수를 prepare function (및 prepared_call)에 allocate of shared memory in PyCUDA으로 전달하는 데 문제가 있습니다. 이런 식으로 오류 메시지를 이해합니다. PyCUDA에 전달하는 변수 중 하나가 float32이 아닌 long입니다. 그러나 나는 변수가 어디서 왔는지를 볼 수 없다.PyCUDA의`prepare` 함수를 사용하는 방법

또한 official exampledocumentation of prepareblockNone 일 필요가 있는지에 대해 서로 모순되는 것처럼 보입니다.

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

출력

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 
+0

가능한 중복 (http://stackoverflow.com/questions/6468132/create-arrays-in-shared-memory-wo-templates-like-in-pyopencl) – talonmies

+0

나는 이것을하는 방법을 설명하는 답변을 주셨습니다. [또 다른 질문입니다] http://stackoverflow.com/questions/6468132/create-arrays-in-shared-memory-wo-templates-like-in-pyopencl/6491754#6491754) 약 한 달 전에 게시했습니다. – talonmies

+0

** 질문 **을 업데이트하여 새로운 코드와 정보를 포함하십시오. – talonmies

답변

5

나는이 같은 문제를 가로 질러 와서 그렇게 간다 답을 일을 내 렸어요. 오류 메시지의 원인이 data_gpu가 GPUArray 예입니다, 당신이 포인터 즉, 효과적으로 (관련 DeviceAllocation 인스턴스를 얻을 수 data_gpu.gpudata을 할 필요가 prepared_call에 전달하기 위해

data_gpu = gpuarray.to_gpu(data) 

함께 만든 즉, 장치 메모리 위치).

또한, 준비하는 블록 인수를 전달하는 것은 지금 deprecated입니다 - 그래서 정확한 호출이 같은 것입니다 : [템플릿 O/PyOpenCL처럼 w를 공유 메모리에 배열 만들기]의

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