Try to use magma_dsyevd in matlab

Open discussion for MAGMA library (Matrix Algebra on GPU and Multicore Architectures)
Post Reply
yuxin
Posts: 2
Joined: Sun Oct 19, 2014 10:51 am

Try to use magma_dsyevd in matlab

Post by yuxin » Sun Oct 19, 2014 11:00 am

Hello every,

I suffer a problem to use magma_dsyevd iin matlab.

The source code I write is:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <cuda_runtime_api.h>
#include <cublas.h>

// includes, project
#include "flops.h"
#include "magma.h"
#include "magma_lapack.h"
#include "testings.h"


#include <math.h>
#include "mex.h"

#define A(i,j) A[i + j*lda]
extern "C"


void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
#define L_OUT plhs[0]
#define A_IN prhs[0]

magma_init();
real_Double_t gpu_perf, gpu_time;
double *h_A, *h_R, *h_work, *L;
double *w;
magma_int_t *iwork;
magma_int_t N, n2, info, lwork, liwork, lda, aux_iwork[1];
double aux_work[1];

magma_vec_t jobz = MagmaVec;
magma_uplo_t uplo = MagmaLower;

magma_int_t i,j;

N = mxGetM(A_IN);
lda = N;
n2 = lda*N;

// query for workspace sizes
magma_dsyevd( jobz, uplo,
N, NULL, lda, NULL,
aux_work, -1,
aux_iwork, -1,
&info );
lwork = (magma_int_t) aux_work[0];
liwork = aux_iwork[0];


TESTING_MALLOC_CPU( h_A, double, n2);
h_A = (double *)mxGetData(A_IN);
L_OUT = mxCreateDoubleMatrix(N,N,mxREAL);
L = mxGetPr(L_OUT);

printf("print out h_A\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%f\t",h_A[i+j*lda]);
printf("\n");
}

/* Allocate host memory for the matrix */
TESTING_MALLOC_CPU( w, double, N );
TESTING_MALLOC_CPU( iwork, magma_int_t, liwork );

TESTING_MALLOC_PIN( h_R, double, N*lda );
TESTING_MALLOC_PIN( h_work, double, lwork );

printf("allocate memory on cpu with pin!\n");
printf("copy h_A to h_R, and then print h_R\n");
memcpy( h_R, h_A, sizeof(double)*n2);

for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%f\t",h_R[i+j*lda]);
}
printf("\n");
}


/* Performs operation using MAGA */
gpu_time = magma_wtime();
printf("start eig\n");
magma_dsyevd( jobz, uplo,
N, h_R, lda, w,
h_work, lwork,
iwork, liwork,
&info );
gpu_time = magma_wtime() - gpu_time;
if (info != 0)
printf("magma_dsyevd returned error %d: %s.\n",
(int) info, magma_strerror( info ));

printf("convey the output\n");
memcpy(L,h_R,sizeof(double)*n2);

TESTING_FREE_CPU( w );
TESTING_FREE_CPU( iwork );
TESTING_FREE_PIN( h_R );
TESTING_FREE_PIN( h_work);
TESTING_FINALIZE();

}

Then I use this Makefile to compile my code into mexa64 file:

# Paths where MAGMA, CUDA, and OpenBLAS are installed
MAGMADIR = /home/yuxin/magma-1.5.0
CUDADIR = /usr/local/cuda

MATLABHOME = /opt/share/MATLAB/R2012b.app/

CC = icpc
LD = icpc
CFLAGS = -Wall
LDFLAGS = -Wall -mkl=parallel

MEX_CFLAGS = -fPIC -ansi -pthread -DMX_COMPAT_32 \
-DMATLAB_MEX_FILE

MAGMA_CFLAGS := -DADD_ -DHAVE_CUBLAS -I$(MAGMADIR)/include -I$(CUDADIR)/include -I$(MAGMADIR)/testing

MAGMA_LIBS := -L$(MAGMADIR)/lib -L$(CUDADIR)/lib64 \
-lmagma -lcublas -lcudart

MEXLIBS := -L/opt/share/MATLAB/R2012b.app/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++

MEX_INCLU := -I$(MATLABHOME)/extern/include -I$(MATLABHOME)/simulink/include

MEXFLAGS := -shared

OBJECT = eig_magma.o
EXECUTABLE = eig_magma

$(EXECUTABLE): $(OBJECT)
$(CC) $(LDFLAGS) $(MEXFLAGS) $(OBJECT) -o $@ $(MAGMA_LIBS) $(MEXLIBS)
eig_magma.o: eig_magma.c
$(CC) $(CFLAGS) $(MAGMA_CFLAGS) $(MEX_INCLU) $(MEX_CFLAGS) -c $< -o $@


clean:
rm -rf eig_magma *.o eig_magma.mexa64

The compliation is successful. However When I run the eig_magma in matlab, matlab execute every line for I call :

magma_dsyevd( jobz, uplo,
N, h_R, lda, w,
h_work, lwork,
iwork, liwork,
&info );
.

matlab just quite when it execute to this line.

Anyone has idea to solve this problem?

Thank you

yuxin

mgates3
Posts: 918
Joined: Fri Jan 06, 2012 2:13 pm

Re: Try to use magma_dsyevd in matlab

Post by mgates3 » Mon Oct 20, 2014 11:19 am

Does the equivalent LAPACK routine work? E.g.,

Code: Select all

lapackf77_dsyevd( "V", "L",
&N, h_R, &lda, w,
h_work, &lwork,
iwork, &liwork,
&info );
You may need to compile MAGMA using MKL_ILP64 to use with Matlab.

BTW, I would not recommend using the TESTING_ macros, nor the testings.h header. Those are used as the testing framework in MAGMA, but are not intended for production use. They simply abort on error. The example in magma/example provides a better example for checking errors from magma routines in production code.

Post Reply