X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a88d4f2d2d1d5cce8f3cc1350f41d0dd52d55a31..b453e96968bb4a1be17a7a3ec2f3c01356b60bf2:/src/smpi/include/private.hpp diff --git a/src/smpi/include/private.hpp b/src/smpi/include/private.hpp index 5238bb508f..b991c406da 100644 --- a/src/smpi/include/private.hpp +++ b/src/smpi/include/private.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2020. 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. */ @@ -461,6 +461,10 @@ void mpi_file_set_view_(int* fh, long long int* offset, int* etype, int* filetyp void mpi_file_read_(int* fh, void* buf, int* count, int* datatype, MPI_Status* status, int* ierr); void mpi_file_write_(int* fh, void* buf, int* count, int* datatype, MPI_Status* status, int* ierr); void smpi_init_fortran_types(); +void smpi_execute_flops_(double* flops); +void smpi_execute_flops_benched_(double* flops); +void smpi_execute_(double* duration); +void smpi_execute_benched_(double* duration); } // extern "C" XBT_PRIVATE int smpi_temp_shm_get(); @@ -498,4 +502,61 @@ XBT_PUBLIC smpi_trace_call_location_t* smpi_trace_get_call_location(); XBT_PRIVATE void private_execute_flops(double flops); + +#define CHECK_ARGS(test, errcode, ...) \ + if (test) { \ + if((errcode) != MPI_SUCCESS) \ + XBT_WARN(__VA_ARGS__); \ + return (errcode); \ + } + +#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_NULL(num,err,buf) \ + CHECK_ARGS((buf) == nullptr, (err), \ + "%s: param %d %s cannot be NULL", __func__, (num), _XBT_STRINGIFY(buf)); +#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_COMM2(num, comm) \ + CHECK_MPI_NULL((num), MPI_COMM_NULL, MPI_ERR_COMM, (comm)) +#define CHECK_COMM(num) \ + CHECK_COMM2((num), comm) +#define CHECK_REQUEST(num) \ + CHECK_ARGS(request == nullptr, MPI_ERR_REQUEST, \ + "%s: param %d request cannot be NULL",__func__, (num)); +#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_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)); +#define CHECK_OP(num) \ + CHECK_MPI_NULL((num), MPI_OP_NULL, MPI_ERR_OP, op) +#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)) +#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)) +#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)) +#define CHECK_WIN(num, 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, \ + "%s: param %d %s (=%d) cannot be < 0 or > %d", __func__, (num), _XBT_STRINGIFY(rank), \ + (rank), (comm)->group()->size() ); #endif