[Trilinos-Users] performance of trilinos

chenliang wang hi181904665 at msn.com
Tue Aug 21 20:38:13 MDT 2012


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;

}





More information about the Trilinos-Users mailing list