-/* Copyright (c) 2007-2014. The SimGrid Team.
+/* Copyright (c) 2007-2015. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#ifndef SMPI_H
#define SMPI_H
+#include <simgrid_config.h>
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
-#include <stddef.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
+#endif
+
+#include <stddef.h>
#include <xbt/misc.h>
#include <xbt/function_types.h>
#define MPI_ROOT 0
#define MPI_INFO_NULL NULL
#define MPI_COMM_TYPE_SHARED 1
-#define MPI_WIN_NULL NULL
+#define MPI_WIN_NULL ((MPI_Win)NULL)
#define MPI_VERSION 1
#define MPI_SUBVERSION 1
typedef enum MPIR_Topo_type {
MPI_GRAPH=1,
MPI_CART=2,
- MPI_DIST_GRAPH=3
+ MPI_DIST_GRAPH=3,
+ MPI_INVALID_TOPO=-1
} MPIR_Topo_type;
typedef ptrdiff_t MPI_Aint;
#define MPI_STATUS_IGNORE ((MPI_Status*)NULL)
#define MPI_STATUSES_IGNORE ((MPI_Status*)NULL)
-#define MPI_DATATYPE_NULL ((MPI_Datatype)NULL)
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_CHAR;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_SHORT;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_INT;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_LONG;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_LONG_LONG;
+#define MPI_DATATYPE_NULL ((const MPI_Datatype)NULL)
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_CHAR;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_SHORT;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_INT;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_LONG;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_LONG_LONG;
#define MPI_LONG_LONG_INT MPI_LONG_LONG
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_SIGNED_CHAR;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UNSIGNED_CHAR;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UNSIGNED_SHORT;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UNSIGNED;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UNSIGNED_LONG;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UNSIGNED_LONG_LONG;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_FLOAT;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_DOUBLE;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_LONG_DOUBLE;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_WCHAR;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_C_BOOL;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_INT8_T;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_INT16_T;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_INT32_T;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_INT64_T;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UINT8_T;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_BYTE;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UINT16_T;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UINT32_T;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UINT64_T;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_C_FLOAT_COMPLEX;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_SIGNED_CHAR;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_UNSIGNED_CHAR;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_UNSIGNED_SHORT;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_UNSIGNED;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_UNSIGNED_LONG;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_UNSIGNED_LONG_LONG;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_FLOAT;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_DOUBLE;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_LONG_DOUBLE;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_WCHAR;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_C_BOOL;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_INT8_T;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_INT16_T;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_INT32_T;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_INT64_T;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_UINT8_T;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_BYTE;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_UINT16_T;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_UINT32_T;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_UINT64_T;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_C_FLOAT_COMPLEX;
#define MPI_C_COMPLEX MPI_C_FLOAT_COMPLEX
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_C_DOUBLE_COMPLEX;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_C_LONG_DOUBLE_COMPLEX;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_AINT;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_OFFSET;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_LB;
-XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UB;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_C_DOUBLE_COMPLEX;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_C_LONG_DOUBLE_COMPLEX;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_AINT;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_OFFSET;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_LB;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_UB;
//The following are datatypes for the MPI functions MPI_MAXLOC and MPI_MINLOC.
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_FLOAT_INT;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_LONG_INT;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_DOUBLE_INT;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_SHORT_INT;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_2INT;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_LONG_DOUBLE_INT;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_2FLOAT;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_2DOUBLE;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_2LONG;//only for compatibility with Fortran
-
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_REAL;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_REAL4;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_REAL8;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_REAL16;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_COMPLEX8;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_COMPLEX16;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_COMPLEX32;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_INTEGER1;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_INTEGER2;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_INTEGER4;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_INTEGER8;
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_INTEGER16;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_FLOAT_INT;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_LONG_INT;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_DOUBLE_INT;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_SHORT_INT;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_2INT;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_LONG_DOUBLE_INT;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_2FLOAT;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_2DOUBLE;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_2LONG;//only for compatibility with Fortran
+
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_REAL;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_REAL4;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_REAL8;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_REAL16;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_COMPLEX8;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_COMPLEX16;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_COMPLEX32;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_INTEGER1;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_INTEGER2;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_INTEGER4;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_INTEGER8;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_INTEGER16;
//for now we only send int values at max
#define MPI_Count int
typedef MPI_Comm_errhandler_function MPI_Comm_errhandler_fn;
#define MPI_INFO_ENV 1
-XBT_PUBLIC_DATA(MPI_Datatype) MPI_PACKED;
+XBT_PUBLIC_DATA( const MPI_Datatype ) MPI_PACKED;
XBT_PUBLIC_DATA(MPI_Errhandler*) MPI_ERRORS_RETURN;
XBT_PUBLIC_DATA(MPI_Errhandler*) MPI_ERRORS_ARE_FATAL;
XBT_PUBLIC_DATA(MPI_Errhandler*) MPI_ERRHANDLER_NULL;
// smpi functions
XBT_PUBLIC(int) smpi_global_size(void);
XBT_PUBLIC(MPI_Comm) smpi_process_comm_self(void);
-/*
-XBT_PUBLIC(void) smpi_exit(int);
-*/
+XBT_PUBLIC(void*) smpi_process_get_user_data(void);
+XBT_PUBLIC(void) smpi_process_set_user_data(void *);
XBT_PUBLIC(void) smpi_execute_flops(double flops);
XBT_PUBLIC(void) smpi_execute(double duration);
XBT_PUBLIC(void) SMPI_init(void);
XBT_PUBLIC(void) SMPI_finalize(void);
-
-
+/* Manual global privatization fallback */
+XBT_PUBLIC(void) smpi_register_static(void* arg, void_f_pvoid_t free_fn);
+XBT_PUBLIC(void) smpi_free_static(void);
+
+#define SMPI_VARINIT_GLOBAL(name,type) \
+type *name = NULL; \
+static void __attribute__((constructor)) __preinit_##name(void) { \
+ if(!name) \
+ name = (type*)calloc(smpi_global_size(), sizeof(type)); \
+} \
+static void __attribute__((destructor)) __postfini_##name(void) { \
+ free(name); \
+ name = NULL; \
+}
+
+#define SMPI_VARINIT_GLOBAL_AND_SET(name,type,expr) \
+type *name = NULL; \
+static void __attribute__((constructor)) __preinit_##name(void) { \
+ size_t size = smpi_global_size(); \
+ size_t i; \
+ type value = expr; \
+ if(!name) { \
+ name = (type*)malloc(size * sizeof(type)); \
+ for(i = 0; i < size; i++) { \
+ name[i] = value; \
+ } \
+ } \
+} \
+static void __attribute__((destructor)) __postfini_##name(void) { \
+ free(name); \
+ name = NULL; \
+}
+
+#define SMPI_VARGET_GLOBAL(name) name[smpi_process_index()]
+
+#define SMPI_VARINIT_STATIC(name,type) \
+static type *name = NULL; \
+if(!name) { \
+ name = (type*)calloc(smpi_global_size(), sizeof(type)); \
+ smpi_register_static(name, xbt_free_f); \
+}
+
+#define SMPI_VARINIT_STATIC_AND_SET(name,type,expr) \
+static type *name = NULL; \
+if(!name) { \
+ size_t size = smpi_global_size(); \
+ size_t i; \
+ type value = expr; \
+ name = (type*)malloc(size * sizeof(type)); \
+ for(i = 0; i < size; i++) { \
+ name[i] = value; \
+ } \
+ smpi_register_static(name, xbt_free_f); \
+}
+
+#define SMPI_VARGET_STATIC(name) name[smpi_process_index()]
SG_END_DECL()
#endif