X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/48df5f82e9ffcc5225d809069713daf8ac638543..73e97710413bba3ee2ae8baab0537fbd78811016:/src/smpi/include/private.hpp diff --git a/src/smpi/include/private.hpp b/src/smpi/include/private.hpp index fb1f518af6..d3c021e775 100644 --- a/src/smpi/include/private.hpp +++ b/src/smpi/include/private.hpp @@ -29,6 +29,7 @@ constexpr unsigned MPI_REQ_COMPLETE = 0x1000; constexpr unsigned MPI_REQ_BSEND = 0x2000; constexpr unsigned MPI_REQ_MATCHED = 0x4000; constexpr unsigned MPI_REQ_CANCELLED = 0x8000; +constexpr unsigned MPI_REQ_NBC = 0x10000; enum class SmpiProcessState { UNINITIALIZED, INITIALIZING, INITIALIZED /*(=MPI_Init called)*/, FINALIZED }; @@ -56,7 +57,7 @@ constexpr int SMPI_RMA_TAG = -6666; extern XBT_PUBLIC int mpi_in_place_; extern XBT_PUBLIC int mpi_bottom_; extern XBT_PUBLIC int mpi_status_ignore_; -extern XBT_PUBLIC int mpi_statuses_ignore_; +extern XBT_PUBLIC int mpi_statuses_ignore_; /* Convert between Fortran and C */ #define FORT_ADDR(addr, val, val2) \ (((void *)(addr) == (void*) &(val2)) \ @@ -79,13 +80,15 @@ XBT_PRIVATE int smpi_get_universe_size(); XBT_PRIVATE void smpi_deployment_register_process(const std::string& instance_id, int rank, const simgrid::s4u::Actor* actor); +XBT_PRIVATE void smpi_deployment_startup_barrier(const std::string& instance_id); XBT_PRIVATE void smpi_deployment_unregister_process(const std::string& instance_id); XBT_PRIVATE MPI_Comm* smpi_deployment_comm_world(const std::string& instance_id); XBT_PRIVATE void smpi_deployment_cleanup_instances(); +XBT_PRIVATE int smpi_deployment_smpirun(const simgrid::s4u::Engine* e, const std::string& hostfile, int np, + const std::string& replayfile, int map, + const std::vector& run_args); -XBT_PRIVATE void smpi_comm_copy_buffer_callback(simgrid::kernel::activity::CommImpl* comm, void* buff, - size_t buff_size); XBT_PRIVATE void smpi_comm_null_copy_buffer_callback(simgrid::kernel::activity::CommImpl* comm, void* buff, size_t buff_size); @@ -114,20 +117,30 @@ XBT_PRIVATE double smpi_cfg_auto_shared_malloc_thresh(); XBT_PRIVATE bool smpi_cfg_display_alloc(); // utilities +XBT_PRIVATE void smpi_init_options_internal(bool called_by_smpi_main); + extern XBT_PRIVATE char* smpi_data_exe_start; // start of the data+bss segment of the executable -extern XBT_PRIVATE int smpi_data_exe_size; // size of the data+bss segment of the executable +extern XBT_PRIVATE size_t smpi_data_exe_size; // size of the data+bss segment of the executable -XBT_PRIVATE void smpi_switch_data_segment(simgrid::s4u::ActorPtr actor); +XBT_PRIVATE bool smpi_switch_data_segment(simgrid::s4u::ActorPtr actor, const void* addr = nullptr); XBT_PRIVATE void smpi_prepare_global_memory_segment(); XBT_PRIVATE void smpi_backup_global_memory_segment(); XBT_PRIVATE void smpi_destroy_global_memory_segments(); XBT_PRIVATE void smpi_bench_destroy(); -XBT_PRIVATE void smpi_bench_begin(); -XBT_PRIVATE void smpi_bench_end(); XBT_PRIVATE void smpi_shared_destroy(); XBT_PRIVATE double smpi_adjust_comp_speed(); +// This helper class uses RAII to call smpi_bench_end() when an object is built, and have smpi_bench_begin() be called +// automatically when going out of scope. +class XBT_PRIVATE SmpiBenchGuard { +public: + SmpiBenchGuard() { smpi_bench_end(); } + SmpiBenchGuard(const SmpiBenchGuard&) = delete; + SmpiBenchGuard& operator=(const SmpiBenchGuard&) = delete; + ~SmpiBenchGuard() { smpi_bench_begin(); } +}; + XBT_PRIVATE unsigned char* smpi_get_tmp_sendbuffer(size_t size); XBT_PRIVATE unsigned char* smpi_get_tmp_recvbuffer(size_t size); XBT_PRIVATE void smpi_free_tmp_buffer(const unsigned char* buf); @@ -494,7 +507,6 @@ struct s_smpi_privatization_region_t { }; using smpi_privatization_region_t = s_smpi_privatization_region_t*; -extern XBT_PRIVATE int smpi_loaded_page; XBT_PRIVATE smpi_privatization_region_t smpi_init_global_memory_segment_process(); /** @@ -531,19 +543,15 @@ XBT_PRIVATE void private_execute_flops(double flops); }\ } -#define CHECK_INIT\ - {\ - int init_flag=0;\ - PMPI_Initialized(&init_flag);\ - CHECK_ARGS((!init_flag), MPI_ERR_OTHER, "%s: MPI_Init was not called !", __func__)\ - PMPI_Finalized(&init_flag);\ - CHECK_ARGS((init_flag), MPI_ERR_OTHER, "%s: MPI_Finalize was already called !", __func__)\ +#define CHECK_INIT \ + { \ + int init_flag = 0; \ + PMPI_Initialized(&init_flag); \ + CHECK_ARGS(not init_flag, MPI_ERR_OTHER, "%s: MPI_Init was not called !", __func__) \ + PMPI_Finalized(&init_flag); \ + CHECK_ARGS(init_flag, MPI_ERR_OTHER, "%s: MPI_Finalize was already called !", __func__) \ } -#define CHECK_MPI_NULL(num, val, err, ptr)\ - CHECK_ARGS((ptr) == (val), (err),\ - "%s: param %d %s cannot be %s", __func__, (num), _XBT_STRINGIFY(ptr), _XBT_STRINGIFY(val)) - #define CHECK_VAL(num, val, err, value)\ CHECK_ARGS((value) == (val), (err),\ "%s: param %d %s cannot be %s", __func__, (num), _XBT_STRINGIFY(value), _XBT_STRINGIFY(val)) @@ -552,6 +560,13 @@ XBT_PRIVATE void private_execute_flops(double flops); CHECK_ARGS((buf) == nullptr, (err),\ "%s: param %d %s cannot be NULL", __func__, (num), _XBT_STRINGIFY(buf)) +#define CHECK_MPI_NULL(num, val, err, ptr)\ + {\ + CHECK_ARGS((ptr) == (val), (err),\ + "%s: param %d %s cannot be %s", __func__, (num), _XBT_STRINGIFY(ptr), _XBT_STRINGIFY(val))\ + CHECK_NULL(num, err, ptr)\ + } + #define CHECK_NEGATIVE(num, err, val)\ CHECK_ARGS((val) < 0, (err),\ "%s: param %d %s cannot be negative", __func__, (num), _XBT_STRINGIFY(val)) @@ -608,8 +623,9 @@ XBT_PRIVATE void private_execute_flops(double flops); #define CHECK_TYPE(num, datatype)\ {\ - CHECK_ARGS(((datatype) == MPI_DATATYPE_NULL|| not (datatype)->is_valid()), MPI_ERR_TYPE,\ - "%s: param %d %s cannot be MPI_DATATYPE_NULL or invalid", __func__, (num), _XBT_STRINGIFY(datatype));\ + CHECK_MPI_NULL((num), MPI_DATATYPE_NULL, MPI_ERR_TYPE, (datatype))\ + CHECK_ARGS((not (datatype)->is_valid()), MPI_ERR_TYPE,\ + "%s: param %d %s is invalid", __func__, (num), _XBT_STRINGIFY(datatype));\ CHECK_DELETED((num), MPI_ERR_TYPE, datatype)\ if (not datatype->is_basic())\ simgrid::smpi::utils::set_current_handle(datatype);\ @@ -618,6 +634,8 @@ XBT_PRIVATE void private_execute_flops(double flops); #define CHECK_OP(num, op, type)\ {\ CHECK_MPI_NULL((num), MPI_OP_NULL, MPI_ERR_OP, (op))\ + CHECK_ARGS((op == MPI_REPLACE || op == MPI_NO_OP), MPI_ERR_OP,\ + "%s: param %d op %s cannot be used in non RMA calls", __func__, (num), _XBT_STRINGIFY(op));\ CHECK_DELETED((num), MPI_ERR_OP, op)\ if (not op->is_predefined())\ simgrid::smpi::utils::set_current_handle(op);\