2011-08-05 6 views
3

prepare function(とprepared_call)の正しいパラメータをallocate of shared memory in PyCUDAに渡す際に問題があります。私はPyCUDAに渡す変数の1つが、float32の代わりにlongであるというエラーメッセージを理解しています。しかし、私は変数がどこから来るのかわかりません。PyCUDAの `prepare`関数の使い方

は、さらにblockNoneかないようにする必要がある場合にofficial exampledocumentation of prepare相反するがに関することを、私には思えません。

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

[PyOpenCLにおけるような共有メモリにアレイを作成し、W/Oテンプレート]の可能な重複( 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)あなたは約1ヶ月前に投稿しました。 – talonmies

+0

**質問**を更新して新しいコードと情報を追加してください – talonmies

答えて

5

私はこの同じ問題に出くわし、それはそうここに答えを動作するように私の時間がかかりました。あなたが関連するDeviceAllocationインスタンス(つまり、効果的にポインタを取得するためにdata_gpu.gpudataを行う必要がありprepared_callするためにそれを渡すには

data_gpu = gpuarray.to_gpu(data) 

でそれを作った。すなわち、エラーメッセージの原因は、data_gpuはGPUArrayインスタンスであるということですデバイスのメモリ位置)。

はまた、調製するブロックの引数を渡すことは今deprecatedある - そう正しい呼び出しは、このようなものであろう:

data_gpu = gpuarray.to_gpu(data) 
func.prepare("P") 
grid = (1,1) 
block = (1,1,1) 
func.prepared_call(grid, block, data_gpu.gpudata) 
関連する問題