Jacket for MATLAB
홈 > SW제품 > Jacket for MATLAB

Jacket SDK 강좌

 

Jacket SDK란?

Jacket SDK는 MEX와 유사한 용도로 사용되며, jacket에서 제공하지 않은 함수를 사용자가 직접 추가할 수 있는 기능을 제공한다. MEX SDK를 통해 C를 활용하여 matlab 함수를 추가할 수 있듯이, Jacket SDK를 통해 Jacket에서 지원하지 않는 함수를 사용자가 직접 CUDA를 활용하여 Jacket 함수를 추가할 수 있다.

 

가령 다음의 함수 명령들에서 gones를 설정하면, fft, *, double 명령 모두 Jacket 지원함수이므로 CUDA 가속을 받게 된다.

 

 

Example MATLAB code:

>> G = gones( 3 );  % Create a GPU matrix
>> G = fft( G );    
% Perform a GPU FFT
>> G = G * G;       
% GPU Matrix Multiply
>> C = double( G ); 
% Bring back to CPU

 

 

 그런데, 만약, fft 함수를 Jacket이 지원하지 않는다고 가정한다면, gones를 통해 GPU matrix를 만들지만, fft(G)가 지원되지 않으므로 CPU모드로 작동되게 된다. 이후의 G*G도 CPU모드로 작동되게 된다.

 

Example MATLAB code:

>> G = gones( 3 );  % Create a GPU matrix
>> G = fft( G );    
% Perform a CPU FFT(가정)
>> G = G * G;       
% CPU Matrix Multiply
>> C = double( G ); 
% CPU

 

 

이때, Jacket이 지원하지 않은 fft(G)를 Jacket SDK로 개발하여 추가했다고 한다면 다음과 같이 CUDA가속이 되는 함수를 만들 수 있게 된다. 물론, fft는 Jacket이 기본지원되지만, 하나의 예로 든 것이다.

Example MATLAB code:

>> G = gones( 3 );  % Create a GPU matrix
>> G = fft( G );    
% Perform a GPU FFT (사용자 정의 함수)
>> G = G * G;       
% GPU Matrix Multiply
>> C = double( G ); 
% Bring back to CPU

 

 

 

Jacket SDK의 메인 함수는

err_t jktFunction(int nlhs, mxArray *plhs[ ],

                            int nrhs, mxArray *prhs[ ]) {      }; 로

MEX의 코드인

void mexFunction(int nlhs, mxArray *plhs[],
                               int nrhs, const mxArray *prhs[]) {   } ;

와 상당히 유사한 구조를 가지고 있다.

 

따라서 MEX 혹은 NV-MEX를 개발한 경험이 있으면 쉽게 Jacket 함수를 추가할 수 있다.

Jacket SDK는 다음의 API를 제공한다.

 

  jkt_matlab

Syntax: bool jkt_matlab(mxArray *m);

Description: This function returns true if the input argument 'm' is a CPU MATLAB array.

 

  jkt_garray

Syntax: bool jkt_garray(mxArray *m);

Description: This function returns true if the input argument 'm' is a Jacket-specific GPU array.

 

  jkt_wrap

Syntax: mxArray *jkt_wrap(mxArray *m);

Description: This function wraps the MATLAB array 'm' into a Jacket-specific GPU array. The input is downcast in precision if necessary, e.g. if double precision CPU data but GPU is only single-precision, then the data is downcast to single-precision before pushing it out. Has no effect on Jacket arrays.

 

  jkt_new

Syntax: mxArray *jkt_new(int rows, int cols, mxClassID cls, bool is_complex);

Description: This function creates a GPU array of size rows*cols and of the type defined by 'cls'.

 

  jkt_new_array

Syntax: mxArray *jkt_new_array(int ndims, const mwSize *dims, mxClassID cls, bool is_complex);

Description: This function creates a GPU array of 'ndims' dimensions with the size of each dimension specified by 'dims' and of the type defined by 'cls'.

 

  jkt_mem

Syntax: err_t jkt_mem(void **, mxArray *m);

Description: This function returns a device side pointer to the input argument 'm' which can be used to safely read/write to the array.

 

  jkt_mem_host

Syntax: err_t jkt_mem_host(void **, mxArray *m);

Description: This function returns a host side pointer to the input argument 'm' which can be used to safely read/write to the array.

 

  jkt_alloc

Syntax: err_t jkt_alloc(void **d_ptr, mwSize bytes);

Description: This function directly allocates 'bytes' amount of CUDA memory and returns a device pointer 'd_ptr'.

 

  jkt_complex

Syntax: bool jkt_complex(mxArray *m);

Description: This function returns true if the input argument 'm' is complex.

 

  jkt_class

Syntax: mxClassID jkt_class(mxArray *m);

Description: This function returns the class type (e.g. mxSINGLE_CLASS, mxLOGICAL_CLASS) of the input argument 'm'.

 

jkt_dims

Syntax: int jkt_dims(mxArray *m, const mwSize **dims);

Description: This function returns the dimensions of the input argument 'm' and stores the result in the output argument 'dims'.

 

  jkt_numel

Syntax: mwSize jkt_numel(mxArray *m);

Description: This function returns the number of elements in the input argument 'm'.

 

  jkt_scalar

Syntax: bool jkt_scalar(mxArray *m);

Description: This function returns true if the input argument 'm' has one element 1.

 

  jkt_gfor

Syntax: int jkt_gfor(mxArray *m);

Description: This function returns non-zero if the given GPU array is associated with a 'gfor' loop. Its value indicates the number of gfor iterations (e.g. tiles) represented in the underlying data. For example, if there are 100 iterations (gfor i=1:100) and the matrix is 30x30, then the underlying data is 30x30x100 elements in size. gfor functionality will be expanded in coming releases.

 

  jktFunction

Syntax: err_t jktFunction(int nlhs, mxArray *plhs[ ], int nrhs, mxArray *prhs[ ]);

Description: This is the Jacket entry function. It mirrors the functionality of the MATLAB 'mexFunction' as defined in the MATLAB documentation. It enables the user to get input from and send output to MATLAB.