which is the best MPI based package for solving eigenvalue problems. He recommended using PETSc.
Here is a quick explanation on how to setup PETSc, SLEPc and run a simple SVD solver.
From PETSc webpage:
PETSc, pronounced PET-see (the S is silent), is a suite of data structures and routines for the scalable (parallel) solution of scientific applications modeled by partial differential equations. It supports MPI, shared memory pthreads, and NVIDIA GPUs, as well as hybrid MPI-shared memory pthreads or MPI-GPU parallelism.
From Slepc homepage:
SLEPc is a software library for the solution of large scale sparse eigenvalue problems on parallel computers. It is an extension of PETSc and can be used for either standard or generalized eigenproblems, with real or complex arithmetic. It can also be used for computing a partial SVD of a large, sparse, rectangular matrix, and to solve quadratic eigenvalue problems.
Here are quick installation instructions:
Download the latest version
For example:
wget http://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-3.2-p5.tar.gz tar xvzf petsc-3.2-p5.tar.gz cd petsc-3.2-p5 c ./configure --with-cc=gcc --with-fc=gfortran --download-f-blas-lapack=1 --download-mpich=1 make all test
Tip: you may want to add --with-precision=single to work with floats instead of doubles (to save memory).
Tip: you may want to use --download-openmpi=1 instead.
Download SLEPc
wget http://www.grycap.upv.es/slepc/download/distrib/slepc-3.2-p3.tar.gz tar xvzf slepc-3.2-p3/ setenv PETSC_DIR /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5 setenv SPLEC_DIR ./slepc-3.2-p3 setenv PETSC_ARCH arch-linux2-c-debug cd $SLEPC_DIR ./configure make SLEPC_DIR=$PWD PETSC_DIR=/mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5 PETSC_ARCH=arch-linux2-c-debug make test
Example for running SVD.
create a directory named svd inside petsc-3.2-p5:
mkdir svd
cd svd
Get the file ex14.c from: http://www.grycap.upv.es/slepc/handson/handson4.html
wget http://www.grycap.upv.es/slepc/documentation/current/src/svd/examples/tutorials/ex14.c.html
Create the following file named Makefile, inside the directory svd and put the following in it:
SLEPC_LIB=../arch-linux2-c-debug/lib/ SLEPC_INC=../include/ SLEPC_ARCH_INC=../arch-linux2-c-debug/include/ PETSC_INC=../../petsc-3.2-p5/include/ PETSC_ARCH_INC=../../petsc-3.2-p5/arch-linux2-c-debug/include/ PETSC_LIB=../../petsc-3.2-p5/arch-linux2-c-debug/lib/ MPI_LIB=../../petsc-3.2-p5/externalpackages/mpich2-1.4.1p1/lib ex14: mpicc -o ex14 ex14.c -L${SLEPC_LIB} -L${PETSC_LIB} -L${MPI_LIB} -I${PETSC_INC} -I${SLEPC_INC} -I${SLEPC_ARCH_INC} -I${PETSC_ARCH_INC} -lslepc -lpetsc -lmpich -lm -lflapack -lfblas -lfmpich -lX11 -lmpl -lpthread -lrt -lgfortranNote: before mpicc it should be a tab (and not spaces).
In Matlab/Octave perpare a Petsc binary file as follows:
>> addpath ../../petsc-3.2-p5/bin/matlab/ >> A=rand(10,10); >> PetscBinaryWrite('A',sparse(A));
Now run the example:
<25|0>bickson@biggerbro:~/petsc/slepc-3.2-p3/svd_example$ ./ex14 -file A -svd_nsv 10 Singular value problem stored in file. Reading REAL matrix from a binary file... Number of iterations of the method: 1 Solution method: cross Number of requested singular values: 1 Stopping condition: tol=1e-08, maxit=100 Number of converged approximate singular triplets: 10 sigma relative error --------------------- ------------------ 5.389506 6.40913e-16 1.680646 6.9377e-16 1.364558 1.005e-15 1.102023 9.88382e-16 0.825067 2.23038e-15 0.756176 1.99212e-15 0.498011 2.9545e-15 0.335541 1.51681e-15 0.187449 4.207e-14 0.124114 3.88213e-14Useful command line options:
-help #display help -info #verbose mode -svd_type #select type of SVD method. Legal types are: cross,cyclic,lanczos,trlanczos,lapack -svd_view #display more info about the solver -svd_nsv #set the number of singular values requested -svd_max_it # maximal number of iterations
Running in parallel:
mpirun -np 8 slepc_program [command line arguments]
Troubleshooting
Problem:
../arch-linux2-c-debug/lib//libslepc.a(veccomp.c.o): In function `SlepcSumNorm2_Local': /mnt/bigbrofs/usr6/bickson/petsc/slepc-3.2-p3/src/vec/veccomp0.h:173: undefined reference to `MPI_Abort' ../arch-linux2-c-debug/lib//libslepc.a(veccomp.c.o): In function `VecNormCompEnd': /mnt/bigbrofs/usr6/bickson/petsc/slepc-3.2-p3/src/vec/veccomp0.h:185: undefined reference to `MPI_Type_free' /mnt/bigbrofs/usr6/bickson/petsc/slepc-3.2-p3/src/vec/veccomp0.h:186: undefined reference to `MPI_Type_free' /mnt/bigbrofs/usr6/bickson/petsc/slepc-3.2-p3/src/vec/veccomp0.h:187: undefined reference to `MPI_Op_free'
Solution: You should link againt MPI, for example add -lmpich to the Makefile command.
Problem:
../arch-linux2-c-debug/lib//libslepc.a(veccomp.c.o): In function `GetNorm2': /mnt/bigbrofs/usr6/bickson/petsc/slepc-3.2-p3/src/vec/veccomp0.h:137: undefined reference to `sqrt'Solution: You should link to math lib, namely add -lm to the Makefile command line.
problem:
../arch-linux2-c-debug/lib//libslepc.a(contiguous.c.o): In function `SlepcUpdateVectors_Noncontiguous_Inplace': /mnt/bigbrofs/usr6/bickson/petsc/slepc-3.2-p3/src/vec/contiguous.c:186: undefined reference to `dgemm_' /mnt/bigbrofs/usr6/bickson/petsc/slepc-3.2-p3/src/vec/contiguous.c:199: undefined reference to `dgemm_' ../arch-linux2-c-debug/lib//libslepc.a(contiguous.c.o): In function `SlepcUpdateStrideVectors': /mnt/bigbrofs/usr6/bickson/petsc/slepc-3.2-p3/src/vec/contiguous.c:391: undefined reference to `dgemm_' /mnt/bigbrofs/usr6/bickson/petsc/slepc-3.2-p3/src/vec/contiguous.c:401: undefined reference to `dgemm_' ../arch-linux2-c-debug/lib//libslepc.a(contiguous.c.o): In function `SlepcVecMAXPBY': /mnt/bigbrofs/usr6/bickson/petsc/slepc-3.2-p3/src/vec/contiguous.c:475: undefined reference to `dgemv_'Solution: You should link against blas and lapack, namely add -lfblas -lflapack to your Makefile command
Problem:
../../petsc-3.2-p5/arch-linux2-c-debug/lib//libpetsc.a(xops.c.o): In function `PetscDrawLine_X': /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/src/sys/draw/impls/x/xops.c:29: undefined reference to `XSetForeground' /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/src/sys/draw/impls/x/xops.c:33: undefined reference to `XDrawLine' ../../petsc-3.2-p5/arch-linux2-c-debug/lib//libpetsc.a(xops.c.o): In function `PetscDrawArrow_X': /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/src/sys/draw/impls/x/xops.c:45: undefined reference to `XSetForeground' /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/src/sys/draw/impls/x/xops.c:49: undefined reference to `XDrawLine' /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/src/sys/draw/impls/x/xops.c:52: undefined reference to `XDrawLine' /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/src/sys/draw/impls/x/xops.c:53: undefined reference to `XDrawLine' /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/src/sys/draw/impls/x/xops.c:55: undefined reference to `XDrawLine' /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/src/sys/draw/impls/x/xops.c:56: undefined reference to `XDrawLine'Solution: Add -lX11 to the makefile compilation command line
problem:
../../petsc-3.2-p5/arch-linux2-c-debug/lib//libmpich.a(init.o): In function `PMPI_Init': /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/externalpackages/mpich2-1.4.1p1/src/mpi/init/init.c:106: undefined reference to `MPL_env2str' /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/externalpackages/mpich2-1.4.1p1/src/mpi/init/init.c:132: undefined reference to `MPL_env2bool'
Solution: Add -lmpl to compilation command line
problem:
../../petsc-3.2-p5/arch-linux2-c-debug/lib//libmpich.a(mpiu_thread.o): In function `MPIU_Thread_create': /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/externalpackages/mpich2-1.4.1p1/src/util/thread/mpiu_thread.c:66: undefined reference to `pthread_create'
Solution: add -lpthread to compilation command line
Problem:
../../petsc-3.2-p5/arch-linux2-c-debug/lib//libmpich.a(ad_iwrite.o): In function `ADIOI_GEN_aio_wait_fn': /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/externalpackages/mpich2-1.4.1p1/src/mpi/romio/adio/common/ad_iwrite.c:266: undefined reference to `aio_suspend64' /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/externalpackages/mpich2-1.4.1p1/src/mpi/romio/adio/common/ad_iwrite.c:276: undefined reference to `aio_error64' /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/externalpackages/mpich2-1.4.1p1/src/mpi/romio/adio/common/ad_iwrite.c:278: undefined reference to `aio_return64'Solution: use mpicc as the compiler instead of gcc
Problem:
../../petsc-3.2-p5/arch-linux2-c-debug/lib//libflapack.a(dgesvd.o): In function `dgesvd': /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/externalpackages/fblaslapack-3.1.1/lapack/dgesvd.f:215: undefined reference to `_gfortran_concat_string' /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/externalpackages/fblaslapack-3.1.1/lapack/dgesvd.f:379: undefined reference to `_gfortran_concat_string' ../../petsc-3.2-p5/arch-linux2-c-debug/lib//libflapack.a(dhseqr.o): In function `dhseqr': /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/externalpackages/fblaslapack-3.1.1/lapack/dhseqr.f:345: undefined reference to `_gfortran_concat_string' ../../petsc-3.2-p5/arch-linux2-c-debug/lib//libflapack.a(dlasd0.o): In function `dlasd0': /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/externalpackages/fblaslapack-3.1.1/lapack/dlasd0.f:200: undefined reference to `_gfortran_pow_i4_i4' ../../petsc-3.2-p5/arch-linux2-c-debug/lib//libflapack.a(dlasda.o): In function `dlasda': /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/externalpackages/fblaslapack-3.1.1/lapack/dlasda.f:330: undefined reference to `_gfortran_pow_i4_i4' /mnt/bigbrofs/usr6/bickson/petsc/petsc-3.2-p5/externalpackages/fblaslapack-3.1.1/lapack/dlasda.f:341: undefined reference to `_gfortran_pow_i4_i4'Solution: Add -lgfortran to the compiler command line
Problem:
[0]PETSC ERROR: --------------------- Error Message ------------------------------------ [0]PETSC ERROR: Must indicate a file name with the -file option.! [0]PETSC ERROR: ------------------------------------------------------------------------Solution: You did not give an input file using the -file command line option. Problem:
13|0>bickson@bigbro6:~/petsc/slepc-3.2-p3$ ./configure
Checking environment... ERROR: PETSc is not configured for architecture arch-installed-petscSolution: You forgot to define PETSC_ARCH. Define it using: setenv PETSC_ARCH arch-linux2-c-debug
Thanks a ton!
ReplyDeleteHow can we print out the singular vectors?
ReplyDeleteAny of the SVD commands return a Vec array.
DeleteFor example: SVDTwoSideLanczos:
PetscErrorCode SVDTwoSideLanczos(SVD svd,PetscReal *alpha,PetscReal *beta,Vec *V,Vec v,Vec *U,PetscInt k,PetscInt n,PetscScalar* work)
{
returns both U array and V array of vectors.
You can print the array using the following code:
void print_vec(const char * name, int pos, Vec pvec){
int i, len;
PetscScalar * data;
VecGetSize(pvec, &len);
VecGetArray(pvec, &data);
printf("%s[%d]\n",name, pos);
for (i=0; i< min(len,PRINTOUT_MAX_LEN); i++){
printf("%.5lg ", data[i]);
}
printf("\n");
}
Did anyone get it run with eclipse? I don't know how to bind the .dylib file to the project.
ReplyDeleteHi its really helpful. Can you please let me know how to save the singular vectors in EX14.c ??
ReplyDeleteI have limited time to supporting SVD, so I prefer to give support for our latest SVD solver in GraphLab. See documentation here: http://docs.graphlab.org/collaborative_filtering.html
DeleteWould love to answer any questions about that...
Hello Danny,
ReplyDeleteI am going to install graphlab, but I would really appreciate if you can tell me how to just save the right singular vectors from EX14.C ?
Kindly let me know.