Memory leak in FEAST routines

Memory leak in FEAST routines

Hi,

I was experimenting with the FEAST routines and found a problem with memory leaks.

In particular, the zfeast_heev routine works perfectly fine, when the parameter "x" is allocated on the stack, e.g, when one defines:

 MKL_Complex16 x[DIM*m0];

but when it is dynamically allocated and stored on the heap, I get a segmentation fault upon calling free (or delete). This implies that the routines do something with this pointer that it is not supposed to do.

I append a minimal example. If you comment out "#define X_ON_HEAP_CPP", the memory is allocated on the stack and everything works fine. With the definition, or that of "#define X_ON_HEAP", the memory is allocated on the heap and the program segfaults when free (or delete) is called.

I am using mkl version 2018.2.199 and compile using g++ version 5.4.0, which I call with the compile flags "-I${MKLROOT}/include  -L${MKLROOT}/lib/intel64  -lmkl_intel_thread -lmkl_rt -lmkl_core -lmkl_intel_lp64 -lm"

 

Can somebody reproduce this issue, maybe also with icc?  How would one correctly allocate dynamic memory for the use in the FEAST routines?

Regards, Moritz

 

#include <iostream>
#include <cmath>
#include <string>
#include <complex>
#include <malloc.h>

#include "mkl.h"
#include "mkl_solvers_ee.h"

using namespace std;

int main(int args, char** argv){
  const MKL_INT m0=4;
  double lambdamin=-1,lambdamax=2;
 

  const MKL_INT DIM=4;
  MKL_Complex16 A[4][4]={  \
{{0.,0.},{sqrt(3.)/2.,0.},{0.,0.},{0.,0.}},  \
{{sqrt(3.)/2.,0.},{0.,0.},{1.,0.},{0.,0.}},  \
{{0.,0.},{1.,0.},{0.,0.},{sqrt(3.)/2.,0.}},  \
{{0.,0.},{0.,0.},{sqrt(3.)/2.,0.},{0.,0.}} };
//The exact eigenvalues are: -1.5, -0.5, 0.5 and 1.5

 

  MKL_Complex16 zero = {0.0, 0.0};
  char uplo = 'F';
  MKL_INT fpm[128];
  MKL_INT n=DIM;
  double epsout=0.;
  MKL_INT loop=0;
  MKL_INT m0var=m0;
  MKL_INT m=m0;
  double res=0.;
  int info=0;
  double lambdaptr[DIM];

#define X_ON_HEAP_CPP
#ifdef X_ON_HEAP_C
  MKL_Complex16 *x=(MKL_Complex16*)malloc(sizeof(MKL_Complex16)*DIM*m0);
#elif defined(X_ON_HEAP_CPP)
  MKL_Complex16 *x=new MKL_Complex16[DIM*m0];
#else
  MKL_Complex16 x[DIM*m0];
#endif

  feastinit(fpm);
  fpm[0]=1;

  zfeast_heev( &uplo, &n,  \
      (MKL_Complex16 *) &A[0][0], &n,  \
      fpm, &epsout, &loop, &lambdamin, &lambdamax, &m0var, \
      lambdaptr, (MKL_Complex16 *) x, &m, &res, &info);

  cout<<"Nr of eigenvalues found: "<<m<<endl<<flush;
   
  for(int i=0;i<m;i++)cout<<lambdaptr[i]<<endl;

#ifdef X_ON_HEAP
  free(x);
#elif defined(X_ON_HEAP_CPP)
  delete[] x;
#endif
  cout<<"Done"<<endl<<flush;

  return 0;
}

 

 

 

 

 

2 posts / 0 new
Last post
For more complete information about compiler optimizations, see our Optimization Notice.

Moritz, this routine should work with memory allocates on the stack or on the heap. First of all pls try to link the example properly as MKL Linker Adviser recommends. 

Leave a Comment

Please sign in to add a comment. Not a member? Join today