Передача GPUArray в feval

У меня есть следующее ядро

__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
        } 
    } 

}

Когда я вызываю ядро ​​​​из MATLAB, используя

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

gtm=k.feval(gtm,b);

он дает следующую ошибку:

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

Может кто-нибудь, пожалуйста, скажите мне, где я ошибаюсь.

Благодарю Вас,

Вихарри П Л В.


person VIHARRI PLV    schedule 08.04.2012    source источник
comment
Double и float не являются одним и тем же типом, не так ли?   -  person talonmies    schedule 08.04.2012
comment
Я получил ответ, спасибо за ответ ..   -  person VIHARRI PLV    schedule 11.04.2012
comment
Если у вас есть решение, опубликуйте его как ответ. Позже вы можете принять его, что показывает, что вопрос был успешно решен.   -  person talonmies    schedule 11.04.2012
comment
Да, пожалуйста, напишите ответ. Надеюсь, это не опечатка у вас: _global_ вместо __global__. :)   -  person harrism    schedule 12.04.2012


Ответы (1)


Объект ядра "k", который создается в MATLAB, имеет следующую структуру:

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

с вышеупомянутым прототипом ядра CUDA, т.е.

__global__ void func( float * arr, int N )

Итак, произошла ошибка несоответствия. Нам нужно либо изменить прототип ядра CUDA на

__global__ void func( double * arr, int N )

или создайте массив MATLAB с «одиночным» типом.

gtm= parallel.gpu.GPUArray(ones(a,b,'single')); 
person VIHARRI PLV    schedule 12.04.2012