#include <time.h>
#endif
+#include <simgrid/datatypes.h>
+#include <smpi/forward.hpp>
#include <stddef.h>
-#include <xbt/misc.h>
#include <xbt/function_types.h>
+#include <xbt/misc.h>
#ifdef _WIN32
#define MPI_CALL(type,name,args) \
#define MPI_TYPECLASS_INTEGER 1
#define MPI_TYPECLASS_COMPLEX 2
#define MPI_ROOT 0
-#define MPI_INFO_NULL NULL
+#define MPI_INFO_NULL ((MPI_Info)NULL)
#define MPI_COMM_TYPE_SHARED 1
#define MPI_WIN_NULL ((MPI_Win)NULL)
-#define MPI_VERSION 1
-#define MPI_SUBVERSION 1
+#define MPI_VERSION 2
+#define MPI_SUBVERSION 2
#define MPI_UNWEIGHTED (int *)0
#define MPI_ARGV_NULL (char **)0
#define MPI_ARGVS_NULL (char ***)0
MPI_COMBINER_HINDEXED_BLOCK
}MPIR_Combiner_enum;
-typedef enum MPIR_Topo_type {
- MPI_GRAPH=1,
- MPI_CART=2,
- MPI_DIST_GRAPH=3,
- MPI_INVALID_TOPO=-1
-} MPIR_Topo_type;
typedef ptrdiff_t MPI_Aint;
typedef long long MPI_Offset;
struct s_MPI_File;
typedef struct s_MPI_File *MPI_File;
-struct s_smpi_mpi_datatype;
-typedef struct s_smpi_mpi_datatype *MPI_Datatype;
+
+typedef SMPI_Datatype *MPI_Datatype;
typedef struct {
int MPI_SOURCE;
int count;
} MPI_Status;
-struct s_smpi_mpi_win;
-typedef struct s_smpi_mpi_win* MPI_Win;
-struct s_smpi_mpi_info;
-typedef struct s_smpi_mpi_info *MPI_Info;
+typedef SMPI_Win* MPI_Win;
+typedef SMPI_Info* MPI_Info;
#define MPI_STATUS_IGNORE ((MPI_Status*)NULL)
#define MPI_STATUSES_IGNORE ((MPI_Status*)NULL)
//defines for fortran compatibility
#if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) || defined(__ia64__)
- #define MPI_INTEGER MPI_INT
- #define MPI_2INTEGER MPI_2INT
- #define MPI_LOGICAL MPI_INT
+#define MPI_INTEGER MPI_INT
+#define MPI_2INTEGER MPI_2INT
+#define MPI_LOGICAL MPI_INT
#else
- #define MPI_INTEGER MPI_LONG
- #define MPI_2INTEGER MPI_2LONG
- #define MPI_LOGICAL MPI_LONG
+#define MPI_INTEGER MPI_LONG
+#define MPI_2INTEGER MPI_2LONG
+#define MPI_LOGICAL MPI_LONG
#endif
#define MPI_Fint int
#define MPI_2DOUBLE_PRECISION MPI_2DOUBLE
typedef void MPI_User_function(void *invec, void *inoutvec, int *len, MPI_Datatype * datatype);
-struct s_smpi_mpi_op;
-typedef struct s_smpi_mpi_op *MPI_Op;
+typedef SMPI_Op *MPI_Op;
#define MPI_OP_NULL ((MPI_Op)NULL)
XBT_PUBLIC_DATA( MPI_Op ) MPI_MAX;
//For accumulate
XBT_PUBLIC_DATA( MPI_Op ) MPI_REPLACE;
-struct s_smpi_mpi_topology;
-typedef struct s_smpi_mpi_topology *MPI_Topology;
-
-struct s_smpi_mpi_group;
-typedef struct s_smpi_mpi_group *MPI_Group;
+typedef SMPI_Group* MPI_Group;
#define MPI_GROUP_NULL ((MPI_Group)NULL)
XBT_PUBLIC_DATA( MPI_Group ) MPI_GROUP_EMPTY;
-struct s_smpi_mpi_communicator;
-typedef struct s_smpi_mpi_communicator *MPI_Comm;
+typedef SMPI_Comm *MPI_Comm;
#define MPI_COMM_NULL ((MPI_Comm)NULL)
XBT_PUBLIC_DATA( MPI_Comm ) MPI_COMM_WORLD;
#define MPI_COMM_SELF smpi_process_comm_self()
-struct s_smpi_mpi_request;
-typedef struct s_smpi_mpi_request *MPI_Request;
+typedef SMPI_Request *MPI_Request;
#define MPI_REQUEST_NULL ((MPI_Request)NULL)
#define MPI_FORTRAN_REQUEST_NULL -1
MPI_CALL(XBT_PUBLIC(int), MPI_Get_address, (void *location, MPI_Aint * address));
MPI_CALL(XBT_PUBLIC(int), MPI_Type_free, (MPI_Datatype * datatype));
MPI_CALL(XBT_PUBLIC(int), MPI_Type_size, (MPI_Datatype datatype, int *size));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_size_x, (MPI_Datatype datatype, MPI_Count *size));
MPI_CALL(XBT_PUBLIC(int), MPI_Type_get_extent, (MPI_Datatype datatype, MPI_Aint * lb, MPI_Aint * extent));
MPI_CALL(XBT_PUBLIC(int), MPI_Type_get_true_extent, (MPI_Datatype datatype, MPI_Aint * lb, MPI_Aint * extent));
MPI_CALL(XBT_PUBLIC(int), MPI_Type_extent, (MPI_Datatype datatype, MPI_Aint * extent));
MPI_CALL(XBT_PUBLIC(int), MPI_Comm_compare, (MPI_Comm comm1, MPI_Comm comm2, int *result));
MPI_CALL(XBT_PUBLIC(int), MPI_Comm_create, (MPI_Comm comm, MPI_Group group, MPI_Comm * newcomm));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_create_group, (MPI_Comm comm, MPI_Group group, int tag, MPI_Comm * newcomm));
MPI_CALL(XBT_PUBLIC(int), MPI_Comm_free, (MPI_Comm * comm));
MPI_CALL(XBT_PUBLIC(int), MPI_Comm_disconnect, (MPI_Comm * comm));
MPI_CALL(XBT_PUBLIC(int), MPI_Comm_split, (MPI_Comm comm, int color, int key, MPI_Comm* comm_out));
MPI_Status *status));
MPI_CALL(XBT_PUBLIC(int), MPI_File_read_at_all,(MPI_File fh, MPI_Offset offset, void * buf, int count,
MPI_Datatype datatype, MPI_Status *status));
+MPI_CALL(XBT_PUBLIC(int), MPI_File_read,(MPI_File fh, void * buf, int count,
+ MPI_Datatype datatype, MPI_Status *status));
+MPI_CALL(XBT_PUBLIC(int), MPI_File_write,(MPI_File fh, const void * buf, int count,
+ MPI_Datatype datatype, MPI_Status *status));
MPI_CALL(XBT_PUBLIC(int), MPI_File_write_at,(MPI_File fh, MPI_Offset offset, const void * buf, int count,
MPI_Datatype datatype, MPI_Status *status));
MPI_CALL(XBT_PUBLIC(int), MPI_File_write_at_all,(MPI_File fh, MPI_Offset offset, const void *buf, int count,
//FIXME: End of all the not yet implemented stuff
// smpi functions
-XBT_PUBLIC(int) smpi_global_size(void);
-XBT_PUBLIC(MPI_Comm) smpi_process_comm_self(void);
-XBT_PUBLIC(void*) smpi_process_get_user_data(void);
+XBT_PUBLIC(int) smpi_global_size();
+XBT_PUBLIC(MPI_Comm) smpi_process_comm_self();
+XBT_PUBLIC(void*) smpi_process_get_user_data();
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(double) smpi_get_host_power_peak_at(int pstate_index);
-XBT_PUBLIC(double) smpi_get_host_current_power_peak(void);
-XBT_PUBLIC(int) smpi_get_host_nb_pstates(void);
+XBT_PUBLIC(double) smpi_get_host_current_power_peak();
+XBT_PUBLIC(int) smpi_get_host_nb_pstates();
XBT_PUBLIC(void) smpi_set_host_pstate(int pstate_index);
-XBT_PUBLIC(int) smpi_get_host_pstate(void);
+XBT_PUBLIC(int) smpi_get_host_pstate();
-XBT_PUBLIC(double) smpi_get_host_consumed_energy(void);
+XBT_PUBLIC(double) smpi_get_host_consumed_energy();
XBT_PUBLIC(int) smpi_usleep(useconds_t usecs);
-#if _POSIX_TIMERS
-
-XBT_PUBLIC(int) smpi_nanosleep(struct timespec *tp, void* t);
+#if _POSIX_TIMERS > 0
+XBT_PUBLIC(int) smpi_nanosleep(const struct timespec *tp, struct timespec * t);
XBT_PUBLIC(int) smpi_clock_gettime(clockid_t clk_id, struct timespec *tp);
#endif
XBT_PUBLIC(unsigned int) smpi_sleep(unsigned int secs);
XBT_PUBLIC(int) smpi_gettimeofday(struct timeval *tv, void* tz);
-XBT_PUBLIC(unsigned long long) smpi_rastro_resolution (void);
-XBT_PUBLIC(unsigned long long) smpi_rastro_timestamp (void);
+XBT_PUBLIC(unsigned long long) smpi_rastro_resolution ();
+XBT_PUBLIC(unsigned long long) smpi_rastro_timestamp ();
XBT_PUBLIC(void) smpi_sample_1(int global, const char *file, int line, int iters, double threshold);
XBT_PUBLIC(int) smpi_sample_2(int global, const char *file, int line);
XBT_PUBLIC(void) smpi_sample_3(int global, const char *file, int line);
+/**
+ * Need a public setter for SMPI copy_callback function, so users can define
+ * their own while still using default SIMIX_copy_callback for MSG copies.
+ */
+XBT_PUBLIC(void) smpi_comm_set_copy_data_callback(void (*callback) (smx_activity_t, void*, size_t));
+
+
/**
* Functions for call location tracing. These functions will be
* called from the user's application! (With the __FILE__ and __LINE__ values
/* Fortran specific stuff */
XBT_PUBLIC(int) __attribute__((weak)) smpi_simulated_main_(int argc, char** argv);
-XBT_PUBLIC(int) __attribute__((weak)) MAIN__(void);
+XBT_PUBLIC(int) __attribute__((weak)) MAIN__();
XBT_PUBLIC(int) smpi_main(int (*realmain) (int argc, char *argv[]),int argc, char *argv[]);
-XBT_PUBLIC(void) __attribute__((weak)) user_main_(void);
-XBT_PUBLIC(int) smpi_process_index(void);
+XBT_PUBLIC(void) __attribute__((weak)) user_main_();
+XBT_PUBLIC(int) smpi_process_index();
XBT_PUBLIC(void) smpi_process_init(int *argc, char ***argv);
/* Trace replay specific stuff */
XBT_PUBLIC(void) smpi_replay_run(int *argc, char***argv);
XBT_PUBLIC(void) SMPI_app_instance_register(const char *name, xbt_main_func_t code, int num_processes);
-XBT_PUBLIC(void) SMPI_init(void);
-XBT_PUBLIC(void) SMPI_finalize(void);
+XBT_PUBLIC(void) SMPI_init();
+XBT_PUBLIC(void) SMPI_finalize();
/* 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);
+XBT_PUBLIC(void) smpi_free_static();
#define SMPI_VARINIT_GLOBAL(name,type) \
type *name = NULL; \