Blame test/mpi/cxx/coll/uallreduce.cxx

Packit 0848f5
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit 0848f5
/*
Packit 0848f5
 *
Packit 0848f5
 *  (C) 2003 by Argonne National Laboratory.
Packit 0848f5
 *      See COPYRIGHT in top-level directory.
Packit 0848f5
 */
Packit 0848f5
#include "mpi.h"
Packit 0848f5
#include "mpitestconf.h"
Packit 0848f5
#ifdef HAVE_IOSTREAM
Packit 0848f5
// Not all C++ compilers have iostream instead of iostream.h
Packit 0848f5
#include <iostream>
Packit 0848f5
#ifdef HAVE_NAMESPACE_STD
Packit 0848f5
// Those that do often need the std namespace; otherwise, a bare "cout"
Packit 0848f5
// is likely to fail to compile
Packit 0848f5
using namespace std;
Packit 0848f5
#endif
Packit 0848f5
#else
Packit 0848f5
#include <iostream.h>
Packit 0848f5
#endif
Packit 0848f5
#include "mpitestcxx.h"
Packit 0848f5
Packit 0848f5
void uop( const void *invec, void *inoutvec, int count, 
Packit 0848f5
	  const MPI::Datatype &datatype )
Packit 0848f5
{
Packit 0848f5
    int i;
Packit 0848f5
    int *cin = (int*)invec, *cout = (int*)inoutvec;
Packit 0848f5
Packit 0848f5
    for (i=0; i
Packit 0848f5
	cout[i] = cin[i] + cout[i];
Packit 0848f5
    }
Packit 0848f5
}
Packit 0848f5
Packit 0848f5
int main( int argc, char **argv )
Packit 0848f5
{
Packit 0848f5
    MPI::Op sumop;
Packit 0848f5
    MPI::Intracomm comm = MPI::COMM_WORLD;
Packit 0848f5
    int errs = 0;
Packit 0848f5
    int size, i, count;
Packit 0848f5
Packit 0848f5
    MTest_Init( );
Packit 0848f5
Packit 0848f5
    sumop.Init( uop, true );
Packit 0848f5
    size = comm.Get_size();
Packit 0848f5
    
Packit 0848f5
    for (count = 1; count < 66000; count = count * 2) {
Packit 0848f5
	int *vin, *vout;
Packit 0848f5
	vin  = new int[count];
Packit 0848f5
	vout = new int[count];
Packit 0848f5
Packit 0848f5
	for (i=0; i
Packit 0848f5
	    vin[i]  = i;
Packit 0848f5
	    vout[i] = -1;
Packit 0848f5
	}
Packit 0848f5
	comm.Allreduce( vin, vout, count, MPI::INT, sumop );
Packit 0848f5
	for (i=0; i
Packit 0848f5
	    if (vout[i] != i * size) {
Packit 0848f5
		errs++;
Packit 0848f5
		if (errs < 10) 
Packit 0848f5
		    cerr << "vout[" << i << "] = " << vout[i] << endl;
Packit 0848f5
	    }
Packit 0848f5
	}
Packit 0848f5
	
Packit 0848f5
	delete[] vin;
Packit 0848f5
	delete[] vout;
Packit 0848f5
    }
Packit 0848f5
    
Packit 0848f5
    sumop.Free();
Packit 0848f5
    MTest_Finalize( errs );
Packit 0848f5
    MPI::Finalize();
Packit 0848f5
    return 0;
Packit 0848f5
}