X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/92ecb26f1bc9a12739d2c04b732099c1b23bc7ac..313a8a55981ce6c9ea67b5dd26793de538487d2f:/src/smpi/include/private.hpp diff --git a/src/smpi/include/private.hpp b/src/smpi/include/private.hpp index c9635c4f1b..87bf3fbeeb 100644 --- a/src/smpi/include/private.hpp +++ b/src/smpi/include/private.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2020. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2021. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -17,7 +17,7 @@ constexpr unsigned MPI_REQ_PERSISTENT = 0x1; constexpr unsigned MPI_REQ_NON_PERSISTENT = 0x2; constexpr unsigned MPI_REQ_SEND = 0x4; constexpr unsigned MPI_REQ_RECV = 0x8; -constexpr unsigned MPI_REQ_RECV_DELETE = 0x10; +constexpr unsigned MPI_REQ_PROBE = 0x10; constexpr unsigned MPI_REQ_ISEND = 0x20; constexpr unsigned MPI_REQ_SSEND = 0x40; constexpr unsigned MPI_REQ_PREPARED = 0x80; @@ -27,6 +27,8 @@ constexpr unsigned MPI_REQ_ACCUMULATE = 0x400; constexpr unsigned MPI_REQ_GENERALIZED = 0x800; constexpr unsigned MPI_REQ_COMPLETE = 0x1000; constexpr unsigned MPI_REQ_BSEND = 0x2000; +constexpr unsigned MPI_REQ_MATCHED = 0x4000; +constexpr unsigned MPI_REQ_CANCELLED = 0x8000; enum class SmpiProcessState { UNINITIALIZED, INITIALIZING, INITIALIZED /*(=MPI_Init called)*/, FINALIZED }; @@ -506,7 +508,7 @@ struct papi_process_data { papi_counter_t counter_data; int event_set; }; -extern std::map units2papi_setup; +extern std::map> units2papi_setup; extern std::unordered_map location2speedup; @@ -532,10 +534,16 @@ XBT_PRIVATE void private_execute_flops(double flops); #define CHECK_NEGATIVE(num, err, val) \ CHECK_ARGS((val) < 0, (err), \ "%s: param %d %s cannot be negative", __func__, (num), _XBT_STRINGIFY(val)); +#define CHECK_NEGATIVE_OR_ZERO(num, err, val) \ + CHECK_ARGS((val) <= 0, (err), \ + "%s: param %d %s cannot be negative or 0", __func__, (num), _XBT_STRINGIFY(val)); #define CHECK_COMM2(num, comm) \ CHECK_MPI_NULL((num), MPI_COMM_NULL, MPI_ERR_COMM, (comm)) +#define CHECK_DELETED(num, err, obj) \ + CHECK_ARGS((obj)->deleted(), (err), "%s: param %d %s has already been freed", __func__, (num), _XBT_STRINGIFY(obj)); #define CHECK_COMM(num) \ - CHECK_COMM2((num), comm) + CHECK_COMM2((num), comm) \ + CHECK_DELETED((num), MPI_ERR_COMM, comm) #define CHECK_REQUEST(num) \ CHECK_ARGS(request == nullptr, MPI_ERR_REQUEST, \ "%s: param %d request cannot be NULL",__func__, (num)); @@ -547,29 +555,40 @@ 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)); -#define CHECK_OP(num) \ - CHECK_MPI_NULL((num), MPI_OP_NULL, MPI_ERR_OP, op) +#define CHECK_OP(num, op, type) \ + CHECK_MPI_NULL((num), MPI_OP_NULL, MPI_ERR_OP, (op)) \ + CHECK_ARGS(((op)->allowed_types() && (((op)->allowed_types() & (type)->flags()) == 0)), MPI_ERR_OP, \ + "%s: param %d op %s can't be applied to type %s", __func__, (num), _XBT_STRINGIFY(op), type->name()); #define CHECK_ROOT(num)\ CHECK_ARGS((root < 0 || root >= comm->size()), MPI_ERR_ROOT, \ "%s: param %d root (=%d) cannot be negative or larger than communicator size (=%d)", __func__, (num), \ root, comm->size()); -#define CHECK_PROC(num,proc) \ - CHECK_MPI_NULL((num), MPI_PROC_NULL, MPI_SUCCESS, (proc)) #define CHECK_INFO(num,info) \ - CHECK_MPI_NULL((num), MPI_INFO_NULL, MPI_ERR_INFO, (info)) + CHECK_MPI_NULL((num), MPI_INFO_NULL, MPI_ERR_INFO, (info)) #define CHECK_TAG(num,tag) \ CHECK_ARGS(((tag) < 0 && (tag) != MPI_ANY_TAG), MPI_ERR_TAG, \ "%s: param %d %s (=%d) cannot be negative", __func__, (num), _XBT_STRINGIFY(tag), (tag)); #define CHECK_FILE(num, fh) \ - CHECK_MPI_NULL((num), MPI_FILE_NULL, MPI_ERR_FILE, (fh)) + CHECK_MPI_NULL((num), MPI_FILE_NULL, MPI_ERR_FILE, (fh)) #define CHECK_OFFSET(num, offset) \ CHECK_NEGATIVE((num), MPI_ERR_DISP, (offset)) #define CHECK_GROUP(num, group) \ - CHECK_MPI_NULL((num), MPI_GROUP_NULL, MPI_ERR_GROUP, (group)) + CHECK_MPI_NULL((num), MPI_GROUP_NULL, MPI_ERR_GROUP, (group)) #define CHECK_WIN(num, win) \ - CHECK_MPI_NULL((num), MPI_WIN_NULL, MPI_ERR_WIN, (win)) + CHECK_MPI_NULL((num), MPI_WIN_NULL, MPI_ERR_WIN, (win)) #define CHECK_RANK(num, rank, comm) \ - CHECK_ARGS(((rank) >= (comm)->group()->size() || (rank) <0), MPI_ERR_RANK, \ + CHECK_ARGS(((rank) >= (comm)->size() || (rank) <0), MPI_ERR_RANK, \ "%s: param %d %s (=%d) cannot be < 0 or > %d", __func__, (num), _XBT_STRINGIFY(rank), \ - (rank), (comm)->group()->size() ); + (rank), (comm)->size() ); +#define CHECK_PROC_RMA(num,proc,win) \ + CHECK_MPI_NULL((num), MPI_PROC_NULL, MPI_SUCCESS, (proc)) \ + CHECK_RANK(num, proc, win->comm()) +#define CHECK_NOT_IN_PLACE_ROOT(num, buf) \ + CHECK_ARGS((buf == MPI_IN_PLACE), MPI_ERR_BUFFER, \ + "%s: param %d %s cannot be MPI_IN_PLACE for rank %d with root %d", __func__, (num), _XBT_STRINGIFY(buf), \ + rank, root); +#define CHECK_NOT_IN_PLACE(num, buf) \ + CHECK_ARGS((buf == MPI_IN_PLACE), MPI_ERR_BUFFER, \ + "%s: param %d %s cannot be MPI_IN_PLACE for rank %d", __func__, (num), _XBT_STRINGIFY(buf), \ + rank); #endif