Adding simple test of GPU aware MPI

This commit is contained in:
Mark Berrill 2021-06-24 16:12:23 -04:00
parent d9746d575b
commit d6b0f45710

View File

@ -10,6 +10,7 @@
#include "common/UnitTest.h"
#include "common/Utilities.h"
#include "common/Utilities.hpp"
#include "common/ScaLBL.h"
#include "ProfilerApp.h"
@ -20,7 +21,6 @@
#include <sched.h>
#endif
#undef MPI_CLASS
#define MPI_CLASS Utilities::MPI
#define MPI_ASSERT ASSERT
@ -1196,6 +1196,65 @@ void testCommDup( UnitTest *ut )
}
// Test GPU aware MPI
void test_GPU_aware( UnitTest *ut )
{
size_t N = 1024*1024;
bool test = true;
// Get the comm to use
MPI_CLASS comm( MPI_COMM_WORLD );
int rank = comm.getRank();
int size = comm.getSize();
try {
// Initialize the device
int device = ScaLBL_SetDevice(rank);
// Allocate buffers
size_t bytes = N*sizeof(double);
double *device_send = nullptr, *device_recv = nullptr;
ScaLBL_AllocateDeviceMemory((void**)&device_send,bytes);
ScaLBL_AllocateDeviceMemory((void**)&device_recv,bytes);
auto host_send = new double[N];
auto host_recv = new double[N];
// Initialize the data
for ( size_t i=0; i<N; i++ ) {
host_send[i] = 10000 * rank + i;
host_recv[i] = 0;
}
ScaLBL_CopyToDevice(device_send,host_send,bytes);
ScaLBL_CopyToDevice(device_recv,host_recv,bytes);
ScaLBL_DeviceBarrier();
// Send/recieve the data
int rank_send = ( rank + 1 ) % size;
int rank_recv = ( rank - 1 + size ) % size;
auto req1 = comm.Isend( device_send, N, rank_send, 1 );
auto req2 = comm.Irecv( device_recv, N, rank_recv, 1 );
comm.wait(req1);
comm.wait(req2);
// Check the data
ScaLBL_CopyToHost(host_send,device_send,bytes);
ScaLBL_CopyToHost(host_recv,device_recv,bytes);
ScaLBL_DeviceBarrier();
for ( size_t i=0; i<N; i++ )
test = test && host_recv[i] == 10000 * rank_recv + i;
// Free buffers
ScaLBL_FreeDeviceMemory(device_send);
ScaLBL_FreeDeviceMemory(device_recv);
delete [] host_send;
delete [] host_recv;
} catch ( ... ) {
test = false;
}
comm.barrier();
if ( test ) {
std::cout << "MPI is GPU aware" << std::endl;
ut->passes("GPU aware MPI" );
} else {
std::cout << "MPI is NOT GPU aware" << std::endl;
ut->failure("GPU aware MPI" );
}
}
// This test will test the MPI class
int main( int argc, char *argv[] )
{
@ -1513,6 +1572,9 @@ int main( int argc, char *argv[] )
std::cout << std::endl;
}
// Test GPU aware MPI
test_GPU_aware( &ut );
} // Limit the scope so objects are destroyed
// Finished testing, report the results