VIHARRI PLV
VIHARRI PLV

Reputation: 595

Passing GPUArray to feval

I have the following kernel

__global__ void func( float * arr, int N ) {

     int rtid = blockDim.x * blockIdx.x + threadIdx.x;

     if( rtid < N )
    {
        float* row = (float*)((char*)arr + rtid*N*sizeof(float) ); 
        for (int c = 1; c < N; ++c) 
        { 
            //Manipulation
        } 
    } 

}

When I call the kernel from MATLAB using

gtm= parallel.gpu.GPUArray(ones(a,b,'double')); 
OR gtm= parallel.gpu.GPUArray(ones(1,b,'double'));

gtm=k.feval(gtm,b);

it is giving the following error:

Error using ==> feval
parallel.gpu.GPUArray must match the exact input type as specified on the kernel
prototype.

Error in ==> sameInit at 65 gtm=k.feval(gtm,b);

Can someone please tell me where am I going wrong.

Thanking You,

Viharri P L V.

Upvotes: 1

Views: 586

Answers (1)

VIHARRI PLV
VIHARRI PLV

Reputation: 595

The kernel object "k" that is being created in MATLAB have the following structure:

 MaxNumLHSArguments: 1
 NumRHSArguments: 2
 ArgumentTypes: {'inout single'  'in int32 scalar'}

with the above mentioned CUDA kernel prototype i.e.,

__global__ void func( float * arr, int N )

So, there was an mismatch error. We need to either change the prototype of the CUDA kernel to

__global__ void func( double * arr, int N )

or create the MATLAB array with 'single' type.

gtm= parallel.gpu.GPUArray(ones(a,b,'single')); 

Upvotes: 1

Related Questions