UMBC High Performance Computing Facility

How to use LAPACK on tara

# Introduction

The Linear Algebra PACKage (LAPACK) library is useful for matrix algebra operations
like singular value decomposition, solving systems of linear equations, and computing
eigenvalues. You may want to consider using it instead of writing your own routines.
For lower level operations like matrix multiplication, see

BLAS. In this tutorial, we will compile and run a program
that uses LAPACK to compute SVDs. Before you begin, make sure to read the

tutorial for compiling C programs.

# Where to find documentation

On this page, we'll show how to use LAPACK functionality within AMD Core Math
Library (ACML). We'll assume that you're using the default
"pgi-9.0-mvapich2-1.4rc2" switcher setting - other MPI+compiler combinations
may not work with the code below.

For more information about the LAPACK routines in ACML, see

- AMD's ACML website
- LAPACK at Netlib has a lot of
information about the library. One useful section contains FORTRAN code for the procedures
- The manual pages on tara (e.g. "man dgesvd") also show the FORTRAN function interfaces
- LAPACK User's Guide
- The ACML header file on tara shows the C interface.
This file is located in: /usr/cluster/pgi/linux86-64/9.0-4/include/acml.h.
You can browse through this file and see all the available functions and their
arguments & return values. Note that there are two versions of most
functions listed - one with an underscore ("_") at the end, and one without
an underscore. Both are versions of the same functional, but the underscore
version is compatible with FORTRAN conventions, and the no-underscore version
is a bit easier to use.

# Example

In this example we will create a matrix, then compute its singular value
decomposition (SVD) using the LAPACK dgesvd function. The SVD of A (m x n)
will consist of U (m x m), S (p x 1, where p = min(m,n)), and VT (n x n)
Our matrices will contain doubles, and be stored in column-major order. Here
is the code

The important line to notice, where the actual SVD computation is happening, is this

dgesvd('A', 'A', m, n, A, m, S, U, m, VT, n, &info);

where the 'A' arguments are flags saying that we want the entire U and VT
matrices filled in by the procedure. For more information, see the
documentation at

Netlib,
or try "man dgesvd" at the command line.
Here is the Makefile

The important part is that we need to link to two more libraries: libacml
and libpgftnrtl. This is accomplished by adding them to the LDFLAGS variable.
Compiling the code should look something like this

[araim1@tara-fe1 pgi_acml]$ make
mpicc -O3 -c99 -Minform=warn -fastsse -c -o main.o main.c
mpicc -O3 -c99 -Minform=warn -fastsse main.o -o matrix_svd -lm -lacml -lpgftnrtl
[araim1@tara-fe1 pgi_acml]$ ls
main.c main.o Makefile matrix_svd
[araim1@tara-fe1 pgi_acml]$

Then running the code should look this

[araim1@tara-fe1 pgi_acml]$ ./matrix_svd
Matrix A (3 x 4) is:
1.0000 0.5000 0.3333 0.2500
0.5000 0.3333 0.2500 0.2000
0.3333 0.2500 0.2000 0.1667
Matrix U (3 x 3) is:
-0.8199 0.5563 0.1349
-0.4662 -0.5123 -0.7213
-0.3322 -0.6543 0.6794
Vector S (3 x 1) is:
1.4519
0.1433
0.0042
Matrix VT (4 x 4) is:
-0.8015 -0.4466 -0.3143 -0.2435
0.5729 -0.3919 -0.5127 -0.5053
0.1692 -0.7398 0.1245 0.6392
-0.0263 0.3157 -0.7892 0.5261
[araim1@tara-fe1 pgi_acml]$

Running the code through the batch system should require no special steps. A
standard SLURM script like the one below should be sufficient.