> I have another issue though, maybe you can help me with this one: > I am trying to create a cuda kernel that works on matrices. > in the visual studio the function has parameters of the type double **matrix. > When I called: > ker = parallel.gpu.CUDAKernel(file_name.ptx','file_name.cu','kernel_name'); > > from matlab, > I got the errors: > " > Error using iParseToken (line 313) > Unable to parse declaration: double * * restored_image > > Error in C:\Program Files\MATLAB\R2012a\toolbox\distcomp\gpu\+parallel\+internal\+gpu\handleKernelArgs.p>iParseCPrototype (line 181) > > > Error in C:\Program Files\MATLAB\R2012a\toolbox\distcomp\gpu\+parallel\+internal\+gpu\handleKernelArgs.p>handleKernelArgs (line 70) > > " > I assume that the pointer to pointer is the problem? > But how can I pass the matrix in other way?
In MATLAB, all matrices (both on the CPU and on the GPU) are stored as simple 1-dimensional arrays in column-major format. Your CUDA kernel should accept 'double *' regardless of the number of dimensions of your data in MATLAB.
When writing a CUDA kernel to access the elements of a matrix, you need to pass in both the pointer to the array and the dimensions of the array so that your CUDA code knows how to dereference the array. For simple elementwise operations, you can simply pass in the number of elements of your array and treat it as if it is a one-dimensional array.
There's an example kernel implementing the 'game of life' on the GPU that ships with MATLAB which relies on 2-dimensional addressing. You can see the CUDA code by executing this in MATLAB: