Commit 316ac29b authored by Antonio Pena Monferrer's avatar Antonio Pena Monferrer Committed by Wesley Bland
Browse files

Added large message cases to getfence1/putfence1



These are meant to hit the >1GB message size and hence test the large
message case in Portals4.
Signed-off-by: default avatarWesley Bland <wbland@anl.gov>
parent 9d7d493b
......@@ -6,20 +6,89 @@
*/
#include "mpi.h"
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include "mpitest.h"
#define LARGE_CNT_CONTIG 550000000
#define LARGE_CNT_NONCONTIG 150000000
/*
static char MTEST_Descrip[] = "Get with Fence";
*/
int main( int argc, char *argv[] )
static inline int test(MPI_Comm comm, int rank, int source, int dest,
MTestDatatype *sendtype, MTestDatatype *recvtype)
{
int errs = 0, err;
int disp_unit;
MPI_Aint extent;
MPI_Win win;
MTestPrintfMsg( 1,
"Getting count = %ld of sendtype %s - count = %ld receive type %s\n",
sendtype->count, MTestGetDatatypeName( sendtype ), recvtype->count,
MTestGetDatatypeName( recvtype ) );
/* Make sure that everyone has a recv buffer */
recvtype->InitBuf( recvtype );
sendtype->InitBuf( sendtype );
/* By default, print information about errors */
recvtype->printErrors = 1;
sendtype->printErrors = 1;
MPI_Type_extent( sendtype->datatype, &extent );
disp_unit = extent < INT_MAX ? extent : 1;
MPI_Win_create( sendtype->buf, sendtype->count * extent,
disp_unit, MPI_INFO_NULL, comm, &win );
MPI_Win_fence( 0, win );
if (rank == source) {
/* The source does not need to do anything besides the
fence */
MPI_Win_fence( 0, win );
}
else if (rank == dest) {
/* To improve reporting of problems about operations, we
change the error handler to errors return */
MPI_Win_set_errhandler( win, MPI_ERRORS_RETURN );
/* This should have the same effect, in terms of
transfering data, as a send/recv pair */
err = MPI_Get( recvtype->buf, recvtype->count,
recvtype->datatype, source, 0,
sendtype->count, sendtype->datatype, win );
if (err) {
errs++;
if (errs < 10) {
MTestPrintError( err );
}
}
err = MPI_Win_fence( 0, win );
if (err) {
errs++;
if (errs < 10) {
MTestPrintError( err );
}
}
err = MTestCheckRecv( 0, recvtype );
if (err) {
errs += err;
}
}
else {
MPI_Win_fence( 0, win );
}
MPI_Win_free( &win );
return errs;
}
int main( int argc, char *argv[] )
{
int errs = 0;
int rank, size, source, dest;
int minsize = 2, count;
MPI_Comm comm;
MPI_Win win;
MPI_Aint extent;
MTestDatatype sendtype, recvtype;
MTest_Init( &argc, &argv );
......@@ -38,61 +107,34 @@ int main( int argc, char *argv[] )
MTEST_DATATYPE_FOR_EACH_COUNT(count) {
while (MTestGetDatatypes( &sendtype, &recvtype, count )) {
/* Make sure that everyone has a recv buffer */
recvtype.InitBuf( &recvtype );
sendtype.InitBuf( &sendtype );
/* By default, print information about errors */
recvtype.printErrors = 1;
sendtype.printErrors = 1;
MPI_Type_extent( sendtype.datatype, &extent );
MPI_Win_create( sendtype.buf, sendtype.count * extent,
(int)extent, MPI_INFO_NULL, comm, &win );
MPI_Win_fence( 0, win );
if (rank == source) {
/* The source does not need to do anything besides the
fence */
MPI_Win_fence( 0, win );
}
else if (rank == dest) {
/* To improve reporting of problems about operations, we
change the error handler to errors return */
MPI_Win_set_errhandler( win, MPI_ERRORS_RETURN );
/* This should have the same effect, in terms of
transfering data, as a send/recv pair */
err = MPI_Get( recvtype.buf, recvtype.count,
recvtype.datatype, source, 0,
sendtype.count, sendtype.datatype, win );
if (err) {
errs++;
if (errs < 10) {
MTestPrintError( err );
}
}
err = MPI_Win_fence( 0, win );
if (err) {
errs++;
if (errs < 10) {
MTestPrintError( err );
}
}
err = MTestCheckRecv( 0, &recvtype );
if (err) {
errs += err;
}
}
else {
MPI_Win_fence( 0, win );
}
MPI_Win_free( &win );
MTestFreeDatatype( &recvtype );
MTestFreeDatatype( &sendtype );
errs += test(comm, rank, source, dest, &sendtype, &recvtype);
MTestFreeDatatype(&sendtype);
MTestFreeDatatype(&recvtype);
}
}
MTestFreeComm(&comm);
}
/* Part #2: simple large size test - contiguous and noncontiguous */
if (sizeof(void *) > 4) { /* Only if > 32-bit architecture */
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_size( MPI_COMM_WORLD, &size );
source = 0;
dest = size - 1;
MTestGetDatatypes(&sendtype, &recvtype, LARGE_CNT_CONTIG);
errs += test(MPI_COMM_WORLD, rank, source, dest, &sendtype, &recvtype);
do {
MTestFreeDatatype(&sendtype);
MTestFreeDatatype(&recvtype);
MTestGetDatatypes(&sendtype, &recvtype, LARGE_CNT_NONCONTIG);
} while (strstr(MTestGetDatatypeName(&sendtype), "vector") == NULL);
errs += test(MPI_COMM_WORLD, rank, source, dest, &sendtype, &recvtype);
MTestFreeDatatype(&sendtype);
MTestFreeDatatype(&recvtype);
}
MTest_Finalize( errs );
MPI_Finalize();
return 0;
......
......@@ -6,24 +6,94 @@
*/
#include "mpi.h"
#include <stdio.h>
#include <string.h>
#include "mpitest.h"
/* These counts allow reasonable sizes for the large tests */
#define LARGE_CNT_CONTIG 550000000
#define LARGE_CNT_NONCONTIG 150000000
/*
static char MTEST_Descrip[] = "Put with Fence";
*/
int main( int argc, char *argv[] )
static inline int test(MPI_Comm comm, int rank, int source, int dest,
MTestDatatype *sendtype, MTestDatatype *recvtype)
{
int errs = 0, err;
MPI_Aint extent;
MPI_Win win;
MTestPrintfMsg( 1,
"Putting count = %ld of sendtype %s - count = %ld receive type %s\n",
sendtype->count, MTestGetDatatypeName( sendtype ), recvtype->count,
MTestGetDatatypeName( recvtype ) );
/* Make sure that everyone has a recv buffer */
recvtype->InitBuf( recvtype );
MPI_Type_extent( recvtype->datatype, &extent );
MPI_Win_create( recvtype->buf, recvtype->count * extent,
extent, MPI_INFO_NULL, comm, &win );
MPI_Win_fence( 0, win );
if (rank == source) {
/* To improve reporting of problems about operations, we
change the error handler to errors return */
MPI_Win_set_errhandler( win, MPI_ERRORS_RETURN );
sendtype->InitBuf( sendtype );
err = MPI_Put( sendtype->buf, sendtype->count,
sendtype->datatype, dest, 0,
recvtype->count, recvtype->datatype, win );
if (err) {
errs++;
if (errs < 10) {
MTestPrintError( err );
}
}
err = MPI_Win_fence( 0, win );
if (err) {
errs++;
if (errs < 10) {
MTestPrintError( err );
}
}
}
else if (rank == dest) {
MPI_Win_fence( 0, win );
/* This should have the same effect, in terms of
transfering data, as a send/recv pair */
err = MTestCheckRecv( 0, recvtype );
if (err) {
if (errs < 10) {
printf( "Data in target buffer did not match for destination datatype %s (put with source datatype %s)\n",
MTestGetDatatypeName( recvtype ),
MTestGetDatatypeName( sendtype ) );
/* Redo the test, with the errors printed */
recvtype->printErrors = 1;
(void)MTestCheckRecv( 0, recvtype );
}
errs += err;
}
}
else {
MPI_Win_fence( 0, win );
}
MPI_Win_free( &win );
return errs;
}
int main( int argc, char *argv[] )
{
int errs = 0;
int rank, size, source, dest;
int minsize = 2, count;
MPI_Comm comm;
MPI_Win win;
MPI_Aint extent;
MTestDatatype sendtype, recvtype;
MTest_Init( &argc, &argv );
/* The following illustrates the use of the routines to
run through a selection of communicators and datatypes.
Use subsets of these for tests that do not involve combinations
......@@ -38,71 +108,34 @@ int main( int argc, char *argv[] )
MTEST_DATATYPE_FOR_EACH_COUNT(count) {
while (MTestGetDatatypes( &sendtype, &recvtype, count )) {
MTestPrintfMsg( 1,
"Putting count = %d of sendtype %s receive type %s\n",
count, MTestGetDatatypeName( &sendtype ),
MTestGetDatatypeName( &recvtype ) );
/* Make sure that everyone has a recv buffer */
recvtype.InitBuf( &recvtype );
MPI_Type_extent( recvtype.datatype, &extent );
MPI_Win_create( recvtype.buf, recvtype.count * extent,
extent, MPI_INFO_NULL, comm, &win );
MPI_Win_fence( 0, win );
if (rank == source) {
/* To improve reporting of problems about operations, we
change the error handler to errors return */
MPI_Win_set_errhandler( win, MPI_ERRORS_RETURN );
sendtype.InitBuf( &sendtype );
err = MPI_Put( sendtype.buf, sendtype.count,
sendtype.datatype, dest, 0,
recvtype.count, recvtype.datatype, win );
if (err) {
errs++;
if (errs < 10) {
MTestPrintError( err );
}
}
err = MPI_Win_fence( 0, win );
if (err) {
errs++;
if (errs < 10) {
MTestPrintError( err );
}
}
}
else if (rank == dest) {
MPI_Win_fence( 0, win );
/* This should have the same effect, in terms of
transfering data, as a send/recv pair */
err = MTestCheckRecv( 0, &recvtype );
if (err) {
if (errs < 10) {
printf( "Data in target buffer did not match for destination datatype %s (put with source datatype %s)\n",
MTestGetDatatypeName( &recvtype ),
MTestGetDatatypeName( &sendtype ) );
/* Redo the test, with the errors printed */
recvtype.printErrors = 1;
(void)MTestCheckRecv( 0, &recvtype );
}
errs += err;
}
}
else {
MPI_Win_fence( 0, win );
}
MPI_Win_free( &win );
MTestFreeDatatype( &sendtype );
MTestFreeDatatype( &recvtype );
errs += test(comm, rank, source, dest, &sendtype, &recvtype);
MTestFreeDatatype(&sendtype);
MTestFreeDatatype(&recvtype);
}
}
MTestFreeComm(&comm);
}
/* Part #2: simple large size test - contiguous and noncontiguous */
if (sizeof(void *) > 4) { /* Only if > 32-bit architecture */
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_size( MPI_COMM_WORLD, &size );
source = 0;
dest = size - 1;
MTestGetDatatypes(&sendtype, &recvtype, LARGE_CNT_CONTIG);
errs += test(MPI_COMM_WORLD, rank, source, dest, &sendtype, &recvtype);
do {
MTestFreeDatatype(&sendtype);
MTestFreeDatatype(&recvtype);
MTestGetDatatypes(&sendtype, &recvtype, LARGE_CNT_NONCONTIG);
} while (strstr(MTestGetDatatypeName(&sendtype), "vector") == NULL);
errs += test(MPI_COMM_WORLD, rank, source, dest, &sendtype, &recvtype);
MTestFreeDatatype(&sendtype);
MTestFreeDatatype(&recvtype);
}
MTest_Finalize( errs );
MPI_Finalize();
return 0;
......
......@@ -2,7 +2,7 @@ winname 2
allocmem 2
putfence1 4
putfidx 4
getfence1 4
getfence1 4 timeLimit=400
accfence1 4
adlb_mimic1 3
accfence2 4
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment