올바른 매개 변수를 prepare
function (및 prepared_call)에 allocate of shared memory in PyCUDA으로 전달하는 데 문제가 있습니다. 이런 식으로 오류 메시지를 이해합니다. PyCUDA에 전달하는 변수 중 하나가 float32
이 아닌 long
입니다. 그러나 나는 변수가 어디서 왔는지를 볼 수 없다.PyCUDA의`prepare` 함수를 사용하는 방법
또한 official example과 documentation of prepare
은 block
이 None
일 필요가 있는지에 대해 서로 모순되는 것처럼 보입니다.
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
가능한 중복 (http://stackoverflow.com/questions/6468132/create-arrays-in-shared-memory-wo-templates-like-in-pyopencl) – talonmies
나는 이것을하는 방법을 설명하는 답변을 주셨습니다. [또 다른 질문입니다] http://stackoverflow.com/questions/6468132/create-arrays-in-shared-memory-wo-templates-like-in-pyopencl/6491754#6491754) 약 한 달 전에 게시했습니다. – talonmies
** 질문 **을 업데이트하여 새로운 코드와 정보를 포함하십시오. – talonmies