XBT_PRIVATE double smpi_mpi_wtime();
XBT_PRIVATE void smpi_mpi_init();
+enum class SharedMallocType { NONE, LOCAL, GLOBAL };
+enum class SmpiPrivStrategies { NONE = 0, MMAP = 1, DLOPEN = 2, DEFAULT = DLOPEN };
+
+XBT_PRIVATE double smpi_cfg_host_speed();
+XBT_PRIVATE bool smpi_cfg_simulate_computation();
+XBT_PRIVATE SharedMallocType smpi_cfg_shared_malloc();
+XBT_PRIVATE double smpi_cfg_cpu_thresh();
+XBT_PRIVATE SmpiPrivStrategies smpi_cfg_privatization();
+XBT_PRIVATE int smpi_cfg_async_small_thresh();
+XBT_PRIVATE int smpi_cfg_detached_send_thresh();
+XBT_PRIVATE bool smpi_cfg_grow_injected_times();
+XBT_PRIVATE double smpi_cfg_iprobe_cpu_usage();
+XBT_PRIVATE bool smpi_cfg_trace_call_location();
+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();
+
// utilities
-extern XBT_PRIVATE double smpi_cpu_threshold;
-extern XBT_PRIVATE double smpi_host_speed;
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
-enum class SharedMallocType { NONE, LOCAL, GLOBAL };
-extern XBT_PRIVATE SharedMallocType smpi_cfg_shared_malloc; // Whether to activate shared malloc
-
XBT_PRIVATE void smpi_switch_data_segment(simgrid::s4u::ActorPtr actor);
XBT_PRIVATE void smpi_prepare_global_memory_segment();
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();
XBT_PRIVATE unsigned char* smpi_get_tmp_sendbuffer(size_t size);
XBT_PRIVATE unsigned char* smpi_get_tmp_recvbuffer(size_t size);
void smpi_init_fortran_types();
} // extern "C"
+XBT_PRIVATE int smpi_temp_shm_get();
+XBT_PRIVATE void* smpi_temp_shm_mmap(int fd, size_t size);
+
struct s_smpi_privatization_region_t {
void* address;
int file_descriptor;
/** @brief Returns the last call location (filename, linenumber). Process-specific. */
XBT_PUBLIC smpi_trace_call_location_t* smpi_trace_get_call_location();
-enum class SmpiPrivStrategies { NONE = 0, MMAP = 1, DLOPEN = 2, DEFAULT = DLOPEN };
-
-extern XBT_PRIVATE SmpiPrivStrategies smpi_privatize_global_variables;
-
XBT_PRIVATE void private_execute_flops(double flops);
+
+#define CHECK_ARGS(test, errcode, ...) \
+ if (test) { \
+ XBT_WARN(__VA_ARGS__); \
+ return (errcode); \
+ }
+
+#define CHECK_COMM(num) \
+ CHECK_ARGS(comm == MPI_COMM_NULL, MPI_ERR_COMM, \
+ "%s: param %d communicator cannot be MPI_COMM_NULL", __func__, num);
+#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, #buf, #count);
+#define CHECK_COUNT(num,count) \
+ CHECK_ARGS(count < 0, MPI_ERR_COUNT, \
+ "%s: param %d %s cannot be negative", __func__, num, #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, #datatype);
+#define CHECK_OP(num) \
+ CHECK_ARGS(op == MPI_OP_NULL, MPI_ERR_OP, \
+ "%s: param %d op cannot be MPI_OP_NULL or invalid", __func__, num);
+#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_NULL(num,err,buf) \
+ CHECK_ARGS(buf == nullptr, err, \
+ "%s: param %d %s cannot be NULL", __func__, num, #buf);
+#define CHECK_PROC(num,proc) \
+ CHECK_ARGS(proc == MPI_PROC_NULL, MPI_SUCCESS, \
+ "%s: param %d %s cannot be MPI_PROC_NULL", __func__, num, #proc);
+#define CHECK_TAG(num,tag) \
+ CHECK_ARGS((tag<0 && tag != MPI_ANY_TAG), MPI_ERR_TAG, \
+ "%s: param %d %s cannot be negative", __func__, num, #tag);
+#define CHECK_FILE(num, fh) \
+ CHECK_ARGS(fh == MPI_FILE_NULL, MPI_ERR_FILE, \
+ "%s: param %d %s cannot be MPI_PROC_NULL", __func__, num, #fh);
#endif