Add MPI emu tests

This commit is contained in:
Kevin Sala 2023-09-01 10:35:18 +02:00
parent 9a628e78ca
commit afb81172a7
6 changed files with 154 additions and 0 deletions

View File

@ -12,3 +12,4 @@ add_subdirectory(ovni)
add_subdirectory(nosv) add_subdirectory(nosv)
add_subdirectory(nanos6) add_subdirectory(nanos6)
add_subdirectory(tampi) add_subdirectory(tampi)
add_subdirectory(mpi)

View File

@ -0,0 +1,8 @@
# Copyright (c) 2023 Barcelona Supercomputing Center (BSC)
# SPDX-License-Identifier: GPL-3.0-or-later
test_emu(func.c MP)
test_emu(func-mismatch.c SHOULD_FAIL
REGEX "thread [0-9]\\+ ended with 1 stacked mpi functions")
test_emu(func-nested.c SHOULD_FAIL
REGEX "same value as last_value")

View File

@ -0,0 +1,23 @@
/* Copyright (c) 2023 Barcelona Supercomputing Center (BSC)
* SPDX-License-Identifier: GPL-3.0-or-later */
#include <stdlib.h>
#include "compat.h"
#include "instr.h"
#include "instr_mpi.h"
int
main(void)
{
/* Test that a thread ending while there is still a mpi function in the
* stack causes the emulator to fail */
instr_start(0, 1);
instr_mpi_init_thread_enter();
/* The thread is left in the MPI_Init_thread state (should fail) */
instr_end();
return 0;
}

View File

@ -0,0 +1,26 @@
/* Copyright (c) 2023 Barcelona Supercomputing Center (BSC)
* SPDX-License-Identifier: GPL-3.0-or-later */
#include <stdlib.h>
#include "compat.h"
#include "instr.h"
#include "instr_mpi.h"
int
main(void)
{
/* Test that a thread calling the mpi function that is already executing
* causes the emulator to fail */
instr_start(0, 1);
instr_mpi_init_thread_enter();
/* The thread runs the same mpi function in a nested way (should fail) */
instr_mpi_init_thread_enter();
instr_mpi_init_thread_exit();
instr_mpi_init_thread_exit();
instr_end();
return 0;
}

65
test/emu/mpi/func.c Normal file
View File

@ -0,0 +1,65 @@
/* Copyright (c) 2023 Barcelona Supercomputing Center (BSC)
* SPDX-License-Identifier: GPL-3.0-or-later */
#include <stdlib.h>
#include "compat.h"
#include "instr.h"
#include "instr_mpi.h"
int
main(void)
{
/* Test that simulates the execution of MPI functions */
const int rank = atoi(getenv("OVNI_RANK"));
const int nranks = atoi(getenv("OVNI_NRANKS"));
instr_start(rank, nranks);
/* Initialize MPI */
instr_mpi_init_thread_enter();
instr_mpi_init_thread_exit();
/* Issue a non-blocking broadcast */
instr_mpi_ibcast_enter();
instr_mpi_ibcast_exit();
/* Wait the broadcast request */
instr_mpi_wait_enter();
instr_mpi_wait_exit();
/* Perform a barrier */
instr_mpi_barrier_enter();
instr_mpi_barrier_exit();
const int ncomms = 100;
/* Simulate multiple nonb-blocking communications */
for (int c = 0; c < ncomms; c++) {
/* Issue a non-blocking synchronous send */
instr_mpi_issend_enter();
instr_mpi_issend_exit();
/* Issue a non-blocking receive */
instr_mpi_irecv_enter();
instr_mpi_irecv_exit();
}
/* Simulate testsome calls until all communications are completed */
for (int c = 0; c < ncomms; c++) {
instr_mpi_testsome_enter();
instr_mpi_testsome_exit();
}
/* Allreduce a value */
instr_mpi_allreduce_enter();
instr_mpi_allreduce_exit();
/* Finalize MPI */
instr_mpi_finalize_enter();
instr_mpi_finalize_exit();
instr_end();
return 0;
}

31
test/emu/mpi/instr_mpi.h Normal file
View File

@ -0,0 +1,31 @@
/* Copyright (c) 2023 Barcelona Supercomputing Center (BSC)
* SPDX-License-Identifier: GPL-3.0-or-later */
#ifndef INSTR_MPI_H
#define INSTR_MPI_H
#include "instr.h"
INSTR_0ARG(instr_mpi_init_thread_enter, "MUt")
INSTR_0ARG(instr_mpi_init_thread_exit, "MUT")
INSTR_0ARG(instr_mpi_finalize_enter, "MUf")
INSTR_0ARG(instr_mpi_finalize_exit, "MUF")
INSTR_0ARG(instr_mpi_wait_enter, "MW[")
INSTR_0ARG(instr_mpi_wait_exit, "MW]")
INSTR_0ARG(instr_mpi_testsome_enter, "MTs")
INSTR_0ARG(instr_mpi_testsome_exit, "MTS")
INSTR_0ARG(instr_mpi_issend_enter, "Mss")
INSTR_0ARG(instr_mpi_issend_exit, "MsS")
INSTR_0ARG(instr_mpi_irecv_enter, "Mr[")
INSTR_0ARG(instr_mpi_irecv_exit, "Mr]")
INSTR_0ARG(instr_mpi_barrier_enter, "MCb")
INSTR_0ARG(instr_mpi_barrier_exit, "MCB")
INSTR_0ARG(instr_mpi_allreduce_enter, "MAr")
INSTR_0ARG(instr_mpi_allreduce_exit, "MAR")
INSTR_0ARG(instr_mpi_ibcast_enter, "Mdb")
INSTR_0ARG(instr_mpi_ibcast_exit, "MdB")
#endif /* INSTR_MPI_H */