aboutsummaryrefslogblamecommitdiff
path: root/matrix/generic/cumatrix.c
blob: 2deb7a33ba147b60342eacc3a83914cd618872e2 (plain) (tree)
1
2
3
4
5
6
7
8
9
10









                                                                             
                                                








                             





                                                                        


                                                 
                                           



                                                                      
                                                               
                                 




                                                                     


                                            




                                                           
                               
                                             
             

 



                                                                
                                            


                                                     


                                                           

                                               
                              
                                                                               
                                          
                                                                               
                                          




                                        
                                                        
                                               
                                             
                           




                                                                     
             

 

                                                           
                                




                                                     

                                                           

                                                           

                               

 









                                                                
                                                

                                                           

                                                 
                                

                                                  


                                 

 
                                               

                                                           







                                                           




                                              
                                               

                                                           
                              



                                              




                                                           



                                                               



                                     






                                                              




















                                                           
 
                                              
                                                    

                                                                  
                               






                                                       
                                                 

                                                                  
                               






                                                       














                                                                     
 
                                                       
                                     

                                       

                                     



                                             
                                   
                       

                               
                                       
                                 

                                                 




































                                                                              
#ifdef NERV_GENERIC_CUMATRIX
#include "matrix.h"
#include "elem_type.h"

#define MATRIX_DATA_FREE(ptr) cuda_matrix_(free)(ptr)
#define MATRIX_DATA_ALLOC(dptr, stride, width, height) \
                            cuda_matrix_(alloc)(dptr, stride, width, height)
#define MATRIX_DATA_WRITE(data, idx, val) cuda_matrix_(write)(data, idx, val)
#define MATRIX_DATA_READ(data, idx) cuda_matrix_(read)(data, idx)
#define MATRIX_INIT(L) cuda_matrix_(init)(L)
#define MATRIX_BASE_TNAME nerv_matrix_cuda_tname
#define NERV_GENERIC_MATRIX
#define NERV_GENERIC_CUKERNEL
#include "../../common.h"
#include "../cukernel.h"
#include "cuda.h"
#include "cuda_runtime.h"
#include "driver_types.h"
#include "cublas_v2.h"

#define CHECK_SAME_DIMENSION(a, b) \
    do { \
        if (!(a->nrow == b->nrow && a->ncol == b->ncol)) \
            nerv_error(L, "Matrices should be of the same dimension"); \
    } while (0)

static cublasHandle_t cublas_handle;

Matrix *nerv_matrix_(new_)(long nrow, long ncol);
void nerv_matrix_(data_free)(Matrix *self);

static void nerv_matrix_(add_)(const Matrix *a, const Matrix *b,
                                const Matrix *c,
                                MATRIX_ELEM alpha, MATRIX_ELEM beta) {
    NERV_CUBLAS_(geam)(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N,
                a->ncol, a->nrow,
                &alpha,
                MATRIX_ELEM_PTR(a), a->stride / sizeof(MATRIX_ELEM),
                &beta,
                MATRIX_ELEM_PTR(b), b->stride / sizeof(MATRIX_ELEM),
                MATRIX_ELEM_PTR(c), c->stride / sizeof(MATRIX_ELEM));
}

static int nerv_matrix_(add)(lua_State *L) {
    Matrix *c = luaT_checkudata(L, 1, nerv_matrix_(tname));
    Matrix *a = luaT_checkudata(L, 2, nerv_matrix_(