X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/bea3ba08392e5da9dfec0119bcd0641e0f0b1a52..1aa1a3203635011aa9d20c445524ba123b25c6fe:/src/smpi/include/private.hpp diff --git a/src/smpi/include/private.hpp b/src/smpi/include/private.hpp index da075e9d62..03f9c70723 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 }; @@ -77,11 +78,15 @@ XBT_PRIVATE simgrid::smpi::ActorExt* smpi_process(); XBT_PRIVATE simgrid::smpi::ActorExt* smpi_process_remote(simgrid::s4u::ActorPtr actor); XBT_PRIVATE int smpi_get_universe_size(); -XBT_PRIVATE void smpi_deployment_register_process(const std::string& instance_id, int rank, simgrid::s4u::Actor* actor); +XBT_PRIVATE void smpi_deployment_register_process(const std::string& instance_id, int rank, + const simgrid::s4u::Actor* actor); 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); @@ -110,12 +115,15 @@ XBT_PRIVATE bool smpi_cfg_trace_call_use_absolute_path(); XBT_PRIVATE std::string smpi_cfg_comp_adjustment_file(); XBT_PRIVATE std::string smpi_cfg_papi_events_file(); 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(); @@ -126,6 +134,16 @@ 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); @@ -492,7 +510,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(); /** @@ -529,9 +546,14 @@ XBT_PRIVATE void private_execute_flops(double flops); }\ } -#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_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_VAL(num, val, err, value)\ CHECK_ARGS((value) == (val), (err),\ @@ -541,6 +563,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)) @@ -558,6 +587,7 @@ XBT_PRIVATE void private_execute_flops(double flops); #define CHECK_COMM(num)\ {\ + CHECK_INIT\ CHECK_COMM2((num), comm)\ CHECK_DELETED((num), MPI_ERR_COMM, comm)\ simgrid::smpi::utils::set_current_handle(comm);\ @@ -575,18 +605,30 @@ XBT_PRIVATE void private_execute_flops(double flops); simgrid::smpi::utils::set_current_handle(*request);\ }\ } +#define SET_BUF1(buf)\ + simgrid::smpi::utils::set_current_buffer(1, _XBT_STRINGIFY(buf), buf); +#define SET_BUF2(buf)\ + simgrid::smpi::utils::set_current_buffer(2, _XBT_STRINGIFY(buf), buf); -#define CHECK_BUFFER(num,buf,count)\ - CHECK_ARGS((buf) == nullptr && (count) > 0, MPI_ERR_BUFFER,\ - "%s: param %d %s cannot be NULL if %s > 0",__func__, (num), _XBT_STRINGIFY(buf), _XBT_STRINGIFY(count)) +#define CHECK_BUFFER2(num,buf,count)\ + CHECK_ARGS((buf) == nullptr && (count) > 0, MPI_ERR_BUFFER,\ + "%s: param %d %s cannot be NULL if %s > 0",__func__, (num), _XBT_STRINGIFY(buf), _XBT_STRINGIFY(count))\ + +#define CHECK_BUFFER(num,buf,count,datatype)\ + {\ + CHECK_BUFFER2(num,buf,count)\ + CHECK_ARGS( simgrid::smpi::utils::get_buffer_size(buf) < (size_t)(count*datatype->get_extent()), MPI_ERR_BUFFER,\ + "%s: param %d message size %zd exceeds buffer %s size %zu",__func__, (num), count*datatype->get_extent(), _XBT_STRINGIFY(buf), simgrid::smpi::utils::get_buffer_size(buf))\ + } #define CHECK_COUNT(num, count)\ CHECK_NEGATIVE((num), MPI_ERR_COUNT, (count)) #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);\ @@ -595,6 +637,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);\