Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Squeeze any block with a given delay (in flops).
[simgrid.git] / include / smpi / smpi.h
index 842aeba..9842282 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2007, 2008, 2009, 2010. 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. */
+
 #ifndef SMPI_H
 #define SMPI_H
 
@@ -23,6 +29,7 @@ SG_BEGIN_DECL()
 
 #define SMPI_RAND_SEED 5
 #define MPI_ANY_SOURCE -1
+#define MPI_PROC_NULL -2
 #define MPI_ANY_TAG -1
 #define MPI_UNDEFINED -1
 
@@ -45,6 +52,8 @@ SG_BEGIN_DECL()
 #define MPI_UNEQUAL   2
 #define MPI_CONGRUENT 3
 
+#define MPI_WTIME_IS_GLOBAL 1
+
 typedef ptrdiff_t MPI_Aint;
 typedef long long MPI_Offset;
 
@@ -55,6 +64,7 @@ typedef struct {
   int MPI_SOURCE;
   int MPI_TAG;
   int MPI_ERROR;
+  int count;
 } MPI_Status;
 
 #define MPI_STATUS_IGNORE NULL
@@ -93,6 +103,15 @@ extern MPI_Datatype MPI_C_LONG_DOUBLE_COMPLEX;
 extern MPI_Datatype MPI_AINT;
 extern MPI_Datatype MPI_OFFSET;
 
+//The following are datatypes for the MPI functions MPI_MAXLOC  and MPI_MINLOC.
+extern MPI_Datatype MPI_FLOAT_INT;
+extern MPI_Datatype MPI_LONG_INT;
+extern MPI_Datatype MPI_DOUBLE_INT;
+extern MPI_Datatype MPI_SHORT_INT;
+extern MPI_Datatype MPI_2INT;
+extern MPI_Datatype MPI_LONG_DOUBLE_INT;
+
+
 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;
@@ -100,6 +119,8 @@ typedef struct s_smpi_mpi_op* MPI_Op;
 #define MPI_OP_NULL NULL
 extern MPI_Op MPI_MAX;
 extern MPI_Op MPI_MIN;
+extern MPI_Op MPI_MAXLOC;
+extern MPI_Op MPI_MINLOC;
 extern MPI_Op MPI_SUM;
 extern MPI_Op MPI_PROD;
 extern MPI_Op MPI_LAND;
@@ -113,6 +134,7 @@ struct s_smpi_mpi_group;
 typedef struct s_smpi_mpi_group* MPI_Group;
 
 #define MPI_GROUP_NULL NULL
+
 extern MPI_Group MPI_GROUP_EMPTY;
 
 struct s_smpi_mpi_communicator;
@@ -120,6 +142,7 @@ typedef struct s_smpi_mpi_communicator* MPI_Comm;
 
 #define MPI_COMM_NULL NULL
 extern 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;
@@ -134,8 +157,12 @@ XBT_PUBLIC(int) MPI_Is_thread_main(int* flag);
 XBT_PUBLIC(int) MPI_Abort(MPI_Comm comm, int errorcode);
 XBT_PUBLIC(double) MPI_Wtime(void);
 
-XBT_PUBLIC(int) MPI_Type_size(MPI_Datatype datatype, size_t* size);
+XBT_PUBLIC(int) MPI_Address(void *location, MPI_Aint *address);
+
+XBT_PUBLIC(int) MPI_Type_free(MPI_Datatype* datatype);
+XBT_PUBLIC(int) MPI_Type_size(MPI_Datatype datatype, int* size);
 XBT_PUBLIC(int) MPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint* lb, MPI_Aint* extent);
+XBT_PUBLIC(int) MPI_Type_extent(MPI_Datatype datatype, MPI_Aint* extent);
 XBT_PUBLIC(int) MPI_Type_lb(MPI_Datatype datatype, MPI_Aint* disp);
 XBT_PUBLIC(int) MPI_Type_ub(MPI_Datatype datatype, MPI_Aint* disp);
 
@@ -158,6 +185,7 @@ XBT_PUBLIC(int) MPI_Group_range_excl(MPI_Group group, int n, int ranges[][3], MP
 XBT_PUBLIC(int) MPI_Comm_rank(MPI_Comm comm, int* rank);
 XBT_PUBLIC(int) MPI_Comm_size(MPI_Comm comm, int* size);
 XBT_PUBLIC(int) MPI_Get_processor_name(char *name, int *resultlen);
+XBT_PUBLIC(int) MPI_Get_count(MPI_Status* status, MPI_Datatype datatype, int* count);
           
 XBT_PUBLIC(int) MPI_Comm_group(MPI_Comm comm, MPI_Group* group);
 XBT_PUBLIC(int) MPI_Comm_compare(MPI_Comm comm1, MPI_Comm comm2, int* result);
@@ -165,6 +193,11 @@ XBT_PUBLIC(int) MPI_Comm_dup(MPI_Comm comm, MPI_Comm* newcomm);
 XBT_PUBLIC(int) MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm* newcomm);
 XBT_PUBLIC(int) MPI_Comm_free(MPI_Comm* comm);
 
+XBT_PUBLIC(int) MPI_Send_init(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm, MPI_Request* request);
+XBT_PUBLIC(int) MPI_Recv_init(void* buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Request* request);
+XBT_PUBLIC(int) MPI_Start(MPI_Request* request);
+XBT_PUBLIC(int) MPI_Startall(int count, MPI_Request* requests);
+XBT_PUBLIC(int) MPI_Request_free(MPI_Request* request);
 XBT_PUBLIC(int) MPI_Irecv(void* buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Request* request);
 XBT_PUBLIC(int) MPI_Isend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm, MPI_Request* request);
 XBT_PUBLIC(int) MPI_Recv(void* buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status* status);
@@ -172,6 +205,7 @@ XBT_PUBLIC(int) MPI_Send(void* buf, int count, MPI_Datatype datatype, int dst, i
 XBT_PUBLIC(int) MPI_Sendrecv(void* sendbuf, int sendcount, MPI_Datatype sendtype, int dst, int sendtag, void* recvbuf, int recvcount, MPI_Datatype recvtype, int src, int recvtag, MPI_Comm comm, MPI_Status* status);
 XBT_PUBLIC(int) MPI_Sendrecv_replace(void* buf, int count, MPI_Datatype datatype, int dst, int sendtag, int src, int recvtag, MPI_Comm comm, MPI_Status* status);
 
+
 XBT_PUBLIC(int) MPI_Test(MPI_Request* request, int* flag, MPI_Status* status);
 XBT_PUBLIC(int) MPI_Testany(int count, MPI_Request requests[], int* index, int* flag, MPI_Status* status);
 XBT_PUBLIC(int) MPI_Wait(MPI_Request* request, MPI_Status* status);
@@ -189,6 +223,7 @@ XBT_PUBLIC(int) MPI_Scatter(void* sendbuf, int sendcount, MPI_Datatype sendtype,
 XBT_PUBLIC(int) MPI_Scatterv(void* sendbuf, int* sendcounts, int* displs, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm);
 XBT_PUBLIC(int) MPI_Reduce(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm);
 XBT_PUBLIC(int) MPI_Allreduce(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm);
+XBT_PUBLIC(int) MPI_Scan(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm);
 XBT_PUBLIC(int) MPI_Reduce_scatter(void* sendbuf, void* recvbuf, int* recvcounts, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm);
 XBT_PUBLIC(int) MPI_Alltoall(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm);
 XBT_PUBLIC(int) MPI_Alltoallv(void* sendbuf, int* sendcounts, int* senddisps, MPI_Datatype sendtype, void* recvbuf, int *recvcounts, int* recvdisps, MPI_Datatype recvtype, MPI_Comm comm);
@@ -200,20 +235,33 @@ XBT_PUBLIC(int) MPI_Comm_split(MPI_Comm comm, int color, int key,
 */
 // smpi functions
 XBT_IMPORT_NO_EXPORT(int) smpi_simulated_main(int argc, char** argv);
+XBT_PUBLIC(MPI_Comm) smpi_process_comm_self(void);
 /*
-XBT_PUBLIC(unsigned int) smpi_sleep(unsigned int);
 XBT_PUBLIC(void) smpi_exit(int);
-XBT_PUBLIC(int) smpi_gettimeofday(struct timeval* tv, struct timezone* tz);
 */
 
-/*
-TODO
-XBT_PUBLIC(void) smpi_do_once_1(const char* file, int line);
-XBT_PUBLIC(int) smpi_do_once_2(void);
-XBT_PUBLIC(void) smpi_do_once_3(void);
+XBT_PUBLIC(unsigned int) smpi_sleep(unsigned int secs);
+XBT_PUBLIC(int) smpi_gettimeofday(struct timeval* tv, struct timezone* tz);
+XBT_PUBLIC(void) smpi_sample_1(int global, const char* file, int line, int max);
+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);
+XBT_PUBLIC(void) smpi_sample_flops(double flops);
 
-#define SMPI_DO_ONCE for (smpi_do_once_1(__FILE__, __LINE__); smpi_do_once_2(); smpi_do_once_3())
-*/
+#define SMPI_SAMPLE_LOCAL(num) for(smpi_sample_1(0, __FILE__, __LINE__, num); \
+                                   smpi_sample_2(0, __FILE__, __LINE__);      \
+                                   smpi_sample_3(0, __FILE__, __LINE__))
+
+#define SMPI_SAMPLE_GLOBAL(num) for(smpi_sample_1(1, __FILE__, __LINE__, num); \
+                                    smpi_sample_2(1, __FILE__, __LINE__);      \
+                                    smpi_sample_3(1, __FILE__, __LINE__))
+
+#define SMPI_SAMPLE_DELAY(flops) for(smpi_sample_flops(flops); 0; )
+
+XBT_PUBLIC(void*) smpi_shared_malloc(size_t size, const char* file, int line);
+#define SMPI_SHARED_MALLOC(size) smpi_shared_malloc(size, __FILE__, __LINE__)
+
+XBT_PUBLIC(void) smpi_shared_free(void* data);
+#define SMPI_SHARED_FREE(data) smpi_shared_free(data)
 
 SG_END_DECL()
 #endif