[gmx-developers] Question about Gromacs BLAS / LAPACK.

Lee-Ping Wang leeping at stanford.edu
Sat Nov 10 17:59:59 CET 2012


Hi there,

 

I have some questions about BLAS and LAPACK in Gromacs, and how to best call
these functions from inside my code.  

 

On my local machine, I migrated my fluctuating charge code from Gromacs
4.0.7 to 4.5.5.  It took a bit of time, but I think the implementation is
now a lot cleaner.  At some point, I would like to create a branch on the
Gromacs repository, but first I need to solve a few issues with BLAS and
LAPACK.  Basically, when I was originally writing the code I used the Intel
headers and libraries, but now I want to convert this to something more
compatible.

 

At the top of my code, I have the following two includes:

 

#include <mkl_cblas.h>

#include <mkl_lapack.h>

 

When I build the executables, I need to source the Intel compiler variables
and make sure to link with the following line:

 

LDFLAGS="-lrt -L$INTEL_PATH/lib/intel64 -L$MKLROOT/lib/em64t
-lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm"

 

I understand this needs to be changed.  I would prefer to use the BLAS and
LAPACK provided by Gromacs, but I don't know how to do this most
effectively, and whether this will result in a performance hit.

 

In my code I call the BLAS and LAPACK functions like this (there are perhaps
100 such calls):

 

cblas_dgemm(101,111,111,N,N,N,1,VT,N,A1,N,0,Ai,N);

dgelss(&N,&N,&nrhs,A1,&N,x,&N,S,&rcond,&rank,work,&lwork,&info); 

 

However, when Gromacs calls its own BLAS and LAPACK functions it looks quite
different:

 

#ifdef GMX_DOUBLE

 
F77_FUNC(dsyevr,DSYEVR)(jobz,"I","L",&n,a,&n,&vl,&vu,&index_lower,&index_upp
er,

                            &abstol,&m,eigenvalues,eigenvectors,&n,

                            isuppz,&w0,&lwork,&iw0,&liwork,&info);

#else

 
F77_FUNC(ssyevr,SSYEVR)(jobz,"I","L",&n,a,&n,&vl,&vu,&index_lower,&index_upp
er,

                            &abstol,&m,eigenvalues,eigenvectors,&n,

                            isuppz,&w0,&lwork,&iw0,&liwork,&info);

#endif

 

The only example I could find for this function call is in
"tools/eigensolver.c" .  I'm worried that conversion will be difficult, plus
I would like to retain the option to use the Intel libraries.  

 

My questions are:

 

1)      How can I most effectively convert my BLAS / LAPACK calls in qtpie.c
so that it uses the Gromacs provided libraries? (link
<https://dl.dropbox.com/u/5381783/qtpie.c> )

2)      How should I write my code so that a user can compile and link using
Intel headers / libraries if they want to?  I imagine it's related to the
--use-external-blas and --use-external-lapack command line options to the
configure script, but I don't know how to use this.

 

Your response is greatly appreciated.

 

Thanks,

 

- Lee-Ping

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://maillist.sys.kth.se/pipermail/gromacs.org_gmx-developers/attachments/20121110/cf7285d7/attachment.html>


More information about the gromacs.org_gmx-developers mailing list