[Trilinos-Users] performance of trilinos

chenliang wang hi181904665 at msn.com
Tue Aug 21 22:32:23 MDT 2012


Hi,Andrey,
I attached cpp file and Makefile(if u wanna use this, the path should be 
modified to the right location).   Thanks !

? 2012-8-22 11:06, Andrey Prokopenko ??:
> Hi  Chen-Liang ,
>
> This code cannot be compiled. For instance, the prototype of 
> get_neighbors requires "int" as a first argument, but in the body of 
> the main MyGlobalElements pointer is passed. Similar with 
> A.InsertGlobalValues.
>
> Are there misprints around during some copy/paste?
>
> Andrey
>
> On Tue, Aug 21, 2012 at 8:38 PM, chenliang wang <hi181904665 at msn.com 
> <mailto:hi181904665 at msn.com>> wrote:
>
>
>     Hi,
>     I use the code listed at the end of this mail to test the speedup
>     using Trilinos (10.10.2 compiled with mkl) in our DELL cluster.To
>     my surprise, there is no significant speedup no matter how many
>     processors I use.(almost 1.5x~1.2x)
>     Is that possible? Is there any more rough benchmarks to compare
>     the speedup ?
>
>     Chen-Liang Wang
>
>     ***********************************************************************************************************************************************************************************************************************************************************************
>     //the example code:
>     // Solve a 2D Laplacian problem
>     // This example builds the matrix and solves it with AztecOO.
>     #include "Epetra_ConfigDefs.h"
>     #ifdef HAVE_MPI
>     #include "mpi.h"
>     #include "Epetra_MpiComm.h"
>     #else
>     #include "Epetra_SerialComm.h"
>     #endif
>     #include "Epetra_Map.h"
>     #include "Epetra_Vector.h"
>     #include "Epetra_CrsMatrix.h"
>     #include "AztecOO.h"
>
>     // external function
>     void get_neighbours( const int i, const int nx, const int ny,
>                   int & left, int & right,
>                   int & lower, int & upper);
>
>     // =========== //
>     // main driver //
>     // =========== //
>
>     int main(int argc, char *argv[])
>     {
>
>     #ifdef HAVE_MPI
>     MPI_Init(&argc, &argv);
>     Epetra_MpiComm Comm(MPI_COMM_WORLD);
>     #else
>     Epetra_SerialComm Comm;
>     #endif
>
>     // number of nodes along the x- and y-axis
>     int nx = 4806;
>     int ny = 4046;
>     int NumGlobalElements = nx * ny;
>
>     // create a linear map
>     Epetra_Map Map(NumGlobalElements,0,Comm);
>
>     // local number of rows
>     int NumMyElements = Map.NumMyElements();
>     // get update list
>     int * MyGlobalElements = new int [NumMyElements];
>     Map.MyGlobalElements( MyGlobalElements );
>
>     // Create a Epetra_Matrix with 5 nonzero per rows
>
>     Epetra_CrsMatrix A(Copy,Map,5);
>
>     // Add rows one-at-a-time
>     // Need some vectors to help
>
>     double Values[4];
>     int Indices[4];
>     int NumEntries;
>     int left, right, lower, upper;
>     double diag = 4.0;
>
>     for( int i=0 ; i<NumMyElements; ++i ) {
>         int NumEntries=0;
>         get_neighbours( MyGlobalElements, nx, ny,
>                  left, right, lower, upper);
>         if( left != -1 ) {
>         Indices[NumEntries] = left;
>         Values[NumEntries] = -1.0;
>         ++NumEntries;
>         }
>         if( right != -1 ) {
>           Indices[NumEntries] = right;
>           Values[NumEntries] = -1.0;
>           ++NumEntries;
>         }
>         if( lower != -1 ) {
>           Indices[NumEntries] = lower;
>           Values[NumEntries] = -1.0;
>           ++NumEntries;
>         }
>         if( upper != -1 ) {
>           Indices[NumEntries] = upper;
>           Values[NumEntries] = -1.0;
>           ++NumEntries;
>         }
>         // put the off-diagonal entries
>         A.InsertGlobalValues(MyGlobalElements, NumEntries, Values,
>     Indices);
>         // Put in the diagonal entry
>         A.InsertGlobalValues(MyGlobalElements, 1, &diag,
>     MyGlobalElements+i);
>     }
>
>     // Finish up
>     A.FillComplete();
>
>     // create x and b vectors
>     Epetra_Vector x(Map);
>     Epetra_Vector b(Map);
>     //b.PutScalar(100.0);
>     b.Random();
>     x.Random();
>     // ==================== AZTECOO INTERFACE ======================
>
>     // create linear problem  Ax=b
>     Epetra_LinearProblem Problem(&A,&x,&b);
>     // create AztecOO instance
>     AztecOO Solver(Problem);
>
>     Solver.SetAztecOption( AZ_precond, AZ_none );//
>     //Solver.SetAztecOption( AZ_precond, AZ_Jacobi );//Jacobi
>     Solver.SetAztecOption( AZ_solver, AZ_cg );//CG
>     //Solver.SetAztecOption( AZ_solver, AZ_gmres );//
>     Solver.SetAztecOption(AZ_output,AZ_all);//
>     Solver.Iterate(100,1E-4);//
>
>     // ==================== END OF AZTECOO INTERFACE ================
>
>     if( Comm.MyPID() == 0 ) {
>         cout << "Solver performed " << Solver.NumIters()
>     << "iterations.\n";
>         cout << "Norm of the true residual = " <<
>     Solver.TrueResidual() << endl;
>     }
>
>     #ifdef HAVE_MPI
>     MPI_Finalize();
>     #endif
>
>     return(EXIT_SUCCESS);
>
>     }
>
>     /****************************************************************************/
>     /****************************************************************************/
>     /****************************************************************************/
>
>     void get_neighbours( const int i, const int nx, const int ny,
>                   int & left, int & right,
>                   int & lower, int & upper)
>     {
>
>     int ix, iy;
>     ix = i%nx;
>     iy = (i - ix)/nx;
>
>     if( ix == 0 )
>         left = -1;
>     else
>         left = i-1;
>     if( ix == nx-1 )
>         right = -1;
>     else
>         right = i+1;
>     if( iy == 0 )
>         lower = -1;
>     else
>         lower = i-nx;
>     if( iy == ny-1 )
>         upper = -1;
>     else
>         upper = i+nx;
>
>     return;
>
>     }
>
>
>
>     _______________________________________________
>     Trilinos-Users mailing list
>     Trilinos-Users at software.sandia.gov
>     <mailto:Trilinos-Users at software.sandia.gov>
>     http://software.sandia.gov/mailman/listinfo/trilinos-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: https://software.sandia.gov/pipermail/trilinos-users/attachments/20120822/c8ce68d4/attachment.html 
-------------- next part --------------
CC = mpicc
CXX = mpicxx 
CFLAGS = -O2 -funroll-loops -fexceptions -march=native -lpthread -lm -fopenmp
LIBPATH = /home/wangcl/trilinos-10.10.2/cmkl/
LIBINC  = $(LIBPATH)/include
LIBDIR  = $(LIBPATH)/lib
OPENBLAS =  /home/wangcl/openblas_lib/lib/libopenblas.a
MKL_BLAS =  /opt/intel/mkl/10.1.2.024/lib/em64t/libmkl_em64t.a 
MKL_LAPACK = /opt/intel/mkl/10.1.2.024/lib/em64t/libmkl_lapack.a 
WHICHBLAS = OPENBLAS
TRILIB= $(CFLAGS) $(LIBDIR)/libgaleri.a $(LIBDIR)/libml.a $(LIBDIR)/libifpack.a $(LIBDIR)/libaztecoo.a $(LIBDIR)/libamesos.a $(LIBDIR)/libbelosepetra.a $(LIBDIR)/libbelos.a $(LIBDIR)/libepetraext.a $(LIBDIR)/libepetra.a $(LIBDIR)/libteuchos.a $(LIBDIR)/libtriutils.a
LINKLIB = $(TRILIB)  $(LAPACKPATH) $(BLASPATH)  -lgomp -lgfortran -lquadmath 
ifeq ($(WHICHBLAS),OPENBLAS)	
	BLASPATH =     $(OPENBLAS) 
	LAPACKPATH = $(OPENBLAS) 
endif
ifeq ($(WHICHBLAS),MKL)	
	BLASPATH =     $(MKL_BLAS) 
	LAPACKPATH = $(MKL_LAPACK) 
	LINKLIB =  -lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core   $(TRILIB)  $(LAPACKPATH) $(BLASPATH)  -lgomp -lgfortran -lquadmath 
endif

TARGET = ./testcode.exe
PREFLAGS=  $(CFLAGS) -I$(LIBINC)

%.o: %.c
	$(CC) $(PREFLAGS) -c $< -o $@
%.o:%.cpp
	$(CXX) $(PREFLAGS) -c $< -o $@

SOURCES = $(wildcard *.c *.cpp)
OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))

$(TARGET) : $(OBJS)
	$(CXX) $(OBJS) -o $(TARGET) $(LINKLIB)
	chmod a+x $(TARGET)

clean:
	rm -rf *.o  $(TARGET)



-------------- next part --------------
// Solve a 2D Laplacian problem
// This example builds the matrix and solves it with AztecOO. 


#include "Epetra_ConfigDefs.h"
#ifdef HAVE_MPI
#include "mpi.h"
#include "Epetra_MpiComm.h"
#else
#include "Epetra_SerialComm.h"
#endif
#include "Epetra_Map.h"
#include "Epetra_Vector.h"
#include "Epetra_CrsMatrix.h"
#include "AztecOO.h"

// external function
void get_neighbours( const int i, const int nx, const int ny,
              int & left, int & right, 
              int & lower, int & upper);

// =========== //
// main driver //
// =========== //

int main(int argc, char *argv[])
{

#ifdef HAVE_MPI
MPI_Init(&argc, &argv);
Epetra_MpiComm Comm(MPI_COMM_WORLD);
#else
Epetra_SerialComm Comm;
#endif

// number of nodes along the x- and y-axis
int nx = 4806;
int ny = 4046;
int NumGlobalElements = nx * ny;

// create a linear map
Epetra_Map Map(NumGlobalElements,0,Comm);

// local number of rows
int NumMyElements = Map.NumMyElements();
// get update list
int * MyGlobalElements = new int [NumMyElements];
Map.MyGlobalElements( MyGlobalElements );

// Create a Epetra_Matrix with 5 nonzero per rows

Epetra_CrsMatrix A(Copy,Map,5);

// Add rows one-at-a-time
// Need some vectors to help

double Values[4];
int Indices[4];
int NumEntries;
int left, right, lower, upper;
double diag = 4.0;

for( int i=0 ; i<NumMyElements; ++i ) {
    int NumEntries=0;
    get_neighbours( MyGlobalElements[i], nx, ny, 
             left, right, lower, upper);
    if( left != -1 ) {
    Indices[NumEntries] = left;
    Values[NumEntries] = -1.0;
    ++NumEntries;
    }
    if( right != -1 ) {
      Indices[NumEntries] = right;
      Values[NumEntries] = -1.0;
      ++NumEntries;
    }
    if( lower != -1 ) {
      Indices[NumEntries] = lower;
      Values[NumEntries] = -1.0;
      ++NumEntries;
    }
    if( upper != -1 ) {
      Indices[NumEntries] = upper;
      Values[NumEntries] = -1.0;
      ++NumEntries;
    }
    // put the off-diagonal entries
    A.InsertGlobalValues(MyGlobalElements[i], NumEntries, Values, Indices);
    // Put in the diagonal entry
    A.InsertGlobalValues(MyGlobalElements[i], 1, &diag, MyGlobalElements+i);
}

// Finish up
A.FillComplete();

// create x and b vectors
Epetra_Vector x(Map);
Epetra_Vector b(Map);
//b.PutScalar(100.0);
b.Random();
x.Random();
// ==================== AZTECOO INTERFACE ======================

// create linear problem Ax=b
Epetra_LinearProblem Problem(&A,&x,&b);
// create AztecOO instance 
AztecOO Solver(Problem);

Solver.SetAztecOption( AZ_precond, AZ_none );//
//Solver.SetAztecOption( AZ_precond, AZ_Jacobi );//
Solver.SetAztecOption( AZ_solver, AZ_cg );//
//Solver.SetAztecOption( AZ_solver, AZ_gmres );//
Solver.SetAztecOption(AZ_output,AZ_all);//
Solver.Iterate(100,1E-4);//
//
// ==================== END OF AZTECOO INTERFACE ================

if( Comm.MyPID() == 0 ) {
    cout << "Solver performed " << Solver.NumIters() 
    << "iterations.\n";
    cout << "Norm of the true residual = " << Solver.TrueResidual() << endl;
}

#ifdef HAVE_MPI
MPI_Finalize();
#endif

return(EXIT_SUCCESS);

}

/****************************************************************************/
/****************************************************************************/
/****************************************************************************/

void get_neighbours( const int i, const int nx, const int ny,
              int & left, int & right, 
              int & lower, int & upper) 
{

int ix, iy;
ix = i%nx;
iy = (i - ix)/nx;

if( ix == 0 ) 
    left = -1;
else 
    left = i-1;
if( ix == nx-1 ) 
    right = -1;
else
    right = i+1;
if( iy == 0 ) 
    lower = -1;
else
    lower = i-nx;
if( iy == ny-1 ) 
    upper = -1;
else
    upper = i+nx;

return;

}



More information about the Trilinos-Users mailing list