#include "private.h"
#include "xbt.h"
+//TODO : remove all this.
static xbt_dict_t comm_lookup = nullptr;
static xbt_dict_t group_lookup = nullptr;
static xbt_dict_t request_lookup = nullptr;
-static xbt_dict_t datatype_lookup = nullptr;
+static xbt_dict_t type_lookup = nullptr;
static xbt_dict_t op_lookup = nullptr;
static xbt_dict_t win_lookup = nullptr;
static xbt_dict_t info_lookup = nullptr;
+static int comm_id=0;
+static int group_id=0;
+static int request_id=0;
+static int type_id=0;
+static int op_id=0;
+static int win_id=0;
+static int info_id=0;
+
static int running_processes = 0;
static void smpi_init_fortran_types(){
if(comm_lookup == nullptr){
comm_lookup = xbt_dict_new_homogeneous(nullptr);
- smpi_comm_c2f(MPI_COMM_WORLD);
+ smpi_comm_add_f(MPI_COMM_WORLD);
group_lookup = xbt_dict_new_homogeneous(nullptr);
request_lookup = xbt_dict_new_homogeneous(nullptr);
- datatype_lookup = xbt_dict_new_homogeneous(nullptr);
+ type_lookup = xbt_dict_new_homogeneous(nullptr);
win_lookup = xbt_dict_new_homogeneous(nullptr);
info_lookup = xbt_dict_new_homogeneous(nullptr);
- smpi_type_c2f(MPI_BYTE);//MPI_BYTE
- smpi_type_c2f(MPI_CHAR);//MPI_CHARACTER
+ smpi_type_add_f(MPI_BYTE);//MPI_BYTE
+ smpi_type_add_f(MPI_CHAR);//MPI_CHARACTER
#if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) || defined(__ia64__)
- smpi_type_c2f(MPI_INT);//MPI_LOGICAL
- smpi_type_c2f(MPI_INT);//MPI_INTEGER
+ smpi_type_add_f(MPI_C_BOOL);//MPI_LOGICAL
+ smpi_type_add_f(MPI_INT);//MPI_INTEGER
#else
- smpi_type_c2f(MPI_LONG);//MPI_LOGICAL
- smpi_type_c2f(MPI_LONG);//MPI_INTEGER
+ smpi_type_add_f(MPI_C_BOOL);//MPI_LOGICAL
+ smpi_type_add_f(MPI_LONG);//MPI_INTEGER
#endif
- smpi_type_c2f(MPI_INT8_T);//MPI_INTEGER1
- smpi_type_c2f(MPI_INT16_T);//MPI_INTEGER2
- smpi_type_c2f(MPI_INT32_T);//MPI_INTEGER4
- smpi_type_c2f(MPI_INT64_T);//MPI_INTEGER8
- smpi_type_c2f(MPI_FLOAT);//MPI_REAL
- smpi_type_c2f(MPI_FLOAT);//MPI_REAL4
- smpi_type_c2f(MPI_DOUBLE);//MPI_REAL8
- smpi_type_c2f(MPI_DOUBLE);//MPI_DOUBLE_PRECISION
- smpi_type_c2f(MPI_C_FLOAT_COMPLEX);//MPI_COMPLEX
- smpi_type_c2f(MPI_C_DOUBLE_COMPLEX);//MPI_DOUBLE_COMPLEX
+ smpi_type_add_f(MPI_INT8_T);//MPI_INTEGER1
+ smpi_type_add_f(MPI_INT16_T);//MPI_INTEGER2
+ smpi_type_add_f(MPI_INT32_T);//MPI_INTEGER4
+ smpi_type_add_f(MPI_INT64_T);//MPI_INTEGER8
+ smpi_type_add_f(MPI_REAL);//MPI_REAL
+ smpi_type_add_f(MPI_REAL4);//MPI_REAL4
+ smpi_type_add_f(MPI_REAL8);//MPI_REAL8
+ smpi_type_add_f(MPI_DOUBLE);//MPI_DOUBLE_PRECISION
+ smpi_type_add_f(MPI_C_FLOAT_COMPLEX);//MPI_COMPLEX
+ smpi_type_add_f(MPI_C_DOUBLE_COMPLEX);//MPI_DOUBLE_COMPLEX
#if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) || defined(__ia64__)
- smpi_type_c2f(MPI_2INT);//MPI_2INTEGER
+ smpi_type_add_f(MPI_2INT);//MPI_2INTEGER
#else
- smpi_type_c2f(MPI_2LONG);//MPI_2INTEGER
+ smpi_type_add_f(MPI_2LONG);//MPI_2INTEGER
#endif
- smpi_type_c2f(MPI_UINT8_T);//MPI_LOGICAL1
- smpi_type_c2f(MPI_UINT16_T);//MPI_LOGICAL2
- smpi_type_c2f(MPI_UINT32_T);//MPI_LOGICAL4
- smpi_type_c2f(MPI_UINT64_T);//MPI_LOGICAL8
- smpi_type_c2f(MPI_2FLOAT);//MPI_2REAL
- smpi_type_c2f(MPI_2DOUBLE);//MPI_2DOUBLE_PRECISION
- smpi_type_c2f(MPI_PTR);//MPI_AINT
- smpi_type_c2f(MPI_UINT64_T);//MPI_OFFSET
- smpi_type_c2f(MPI_UINT64_T);//MPI_COUNT
- smpi_type_c2f(MPI_DATATYPE_NULL);//MPI_REAL16
- smpi_type_c2f(MPI_DATATYPE_NULL);//MPI_COMPLEX8
- smpi_type_c2f(MPI_DATATYPE_NULL);//MPI_COMPLEX16
- smpi_type_c2f(MPI_DATATYPE_NULL);//MPI_COMPLEX32
- smpi_type_c2f(MPI_DATATYPE_NULL);//MPI_PACKED
+ smpi_type_add_f(MPI_UINT8_T);//MPI_LOGICAL1
+ smpi_type_add_f(MPI_UINT16_T);//MPI_LOGICAL2
+ smpi_type_add_f(MPI_UINT32_T);//MPI_LOGICAL4
+ smpi_type_add_f(MPI_UINT64_T);//MPI_LOGICAL8
+ smpi_type_add_f(MPI_2FLOAT);//MPI_2REAL
+ smpi_type_add_f(MPI_2DOUBLE);//MPI_2DOUBLE_PRECISION
+ smpi_type_add_f(MPI_PTR);//MPI_AINT
+ smpi_type_add_f(MPI_OFFSET);//MPI_OFFSET
+ smpi_type_add_f(MPI_AINT);//MPI_COUNT
+ smpi_type_add_f(MPI_DATATYPE_NULL);//MPI_REAL16
+ smpi_type_add_f(MPI_DATATYPE_NULL);//MPI_COMPLEX8
+ smpi_type_add_f(MPI_DATATYPE_NULL);//MPI_COMPLEX16
+ smpi_type_add_f(MPI_DATATYPE_NULL);//MPI_COMPLEX32
+ smpi_type_add_f(MPI_DATATYPE_NULL);//MPI_PACKED
op_lookup = xbt_dict_new_homogeneous(nullptr);
- smpi_op_c2f(MPI_MAX);
- smpi_op_c2f(MPI_MIN);
- smpi_op_c2f(MPI_MAXLOC);
- smpi_op_c2f(MPI_MINLOC);
- smpi_op_c2f(MPI_SUM);
- smpi_op_c2f(MPI_PROD);
- smpi_op_c2f(MPI_LAND);
- smpi_op_c2f(MPI_LOR);
- smpi_op_c2f(MPI_LXOR);
- smpi_op_c2f(MPI_BAND);
- smpi_op_c2f(MPI_BOR);
- smpi_op_c2f(MPI_BXOR);
+ smpi_op_add_f(MPI_MAX);
+ smpi_op_add_f(MPI_MIN);
+ smpi_op_add_f(MPI_MAXLOC);
+ smpi_op_add_f(MPI_MINLOC);
+ smpi_op_add_f(MPI_SUM);
+ smpi_op_add_f(MPI_PROD);
+ smpi_op_add_f(MPI_LAND);
+ smpi_op_add_f(MPI_LOR);
+ smpi_op_add_f(MPI_LXOR);
+ smpi_op_add_f(MPI_BAND);
+ smpi_op_add_f(MPI_BOR);
+ smpi_op_add_f(MPI_BXOR);
}
}
-int smpi_comm_c2f(MPI_Comm comm) {
- static int comm_id = 0;
+template <typename T> int smpi_add_f(T t, xbt_dict_t dict, int* id) {
char key[KEY_SIZE];
- xbt_dict_set(comm_lookup, comm==MPI_COMM_WORLD? get_key(key, comm_id) : get_key_id(key, comm_id), comm, nullptr);
- comm_id++;
- return comm_id-1;
+ xbt_dict_set(dict, get_key(key, *id), t, nullptr);
+ (*id)++;
+ return *id-1;
}
-static void free_comm(int comm) {
+template <> int smpi_add_f<MPI_Comm>(MPI_Comm comm, xbt_dict_t dict, int* id) {
char key[KEY_SIZE];
- xbt_dict_remove(comm_lookup, comm==0? get_key(key, comm) : get_key_id(key, comm));
+ xbt_dict_set(dict, comm==MPI_COMM_WORLD? get_key(key, *id) : get_key_id(key, *id), comm, nullptr);
+ (*id)++;
+ return *id-1;
}
-MPI_Comm smpi_comm_f2c(int comm) {
- smpi_init_fortran_types();
- if(comm == -2) {
- return MPI_COMM_SELF;
- } else if(comm==0){
- return MPI_COMM_WORLD;
- } else if(comm_lookup != nullptr && comm >= 0) {
- char key[KEY_SIZE];
- MPI_Comm tmp = static_cast<MPI_Comm>(xbt_dict_get_or_null(comm_lookup,get_key_id(key, comm)));
- return tmp != nullptr ? tmp : MPI_COMM_NULL ;
- } else {
- return MPI_COMM_NULL;
- }
-}
-
-int smpi_group_c2f(MPI_Group group) {
- static int group_id = 0;
+template <> int smpi_add_f<MPI_Request>(MPI_Request request, xbt_dict_t dict, int* id) {
char key[KEY_SIZE];
- xbt_dict_set(group_lookup, get_key(key, group_id), group, nullptr);
- group_id++;
- return group_id-1;
-}
-
-MPI_Group smpi_group_f2c(int group) {
- smpi_init_fortran_types();
- if(group == -2) {
- return MPI_GROUP_EMPTY;
- } else if(group_lookup != nullptr && group >= 0) {
- char key[KEY_SIZE];
- return static_cast<MPI_Group>(xbt_dict_get_or_null(group_lookup, get_key(key, group)));
- } else {
- return MPI_GROUP_NULL;
- }
+ xbt_dict_set(dict, get_key_id(key, *id), request, nullptr);
+ (*id)++;
+ return *id-1;
}
-static void free_group(int group) {
- char key[KEY_SIZE];
- xbt_dict_remove(group_lookup, get_key(key, group));
+template <typename T> int smpi_c2f(T t, xbt_dict_t dict, int* id) {
+ char* existing_key = xbt_dict_get_key(dict, t);
+ if(existing_key!=nullptr)
+ return atoi(existing_key);
+ else
+ return smpi_add_f<T>(t,dict,id);
}
-int smpi_request_c2f(MPI_Request req) {
- static int request_id = 0;
+template <typename T> void free_f(int id, xbt_dict_t dict) {
char key[KEY_SIZE];
- xbt_dict_set(request_lookup, get_key_id(key, request_id), req, nullptr);
- request_id++;
- return request_id-1;
+ xbt_dict_remove(dict, get_key(key, id));
}
-MPI_Request smpi_request_f2c(int req) {
- smpi_init_fortran_types();
+template <> void free_f<MPI_Comm>(int id, xbt_dict_t dict) {
char key[KEY_SIZE];
- if(req==MPI_FORTRAN_REQUEST_NULL)
- return MPI_REQUEST_NULL;
- return static_cast<MPI_Request>(xbt_dict_get(request_lookup, get_key_id(key, req)));
+ xbt_dict_remove(dict, id==0? get_key(key, id) : get_key_id(key, id));
}
-static void free_request(int request) {
+template <> void free_f<MPI_Request>(int id, xbt_dict_t dict) {
char key[KEY_SIZE];
- if(request!=MPI_FORTRAN_REQUEST_NULL)
- xbt_dict_remove(request_lookup, get_key_id(key, request));
+ if(id!=MPI_FORTRAN_REQUEST_NULL)
+ xbt_dict_remove(dict, get_key_id(key, id));
}
-int smpi_type_c2f(MPI_Datatype datatype) {
- static int datatype_id = 0;
- char key[KEY_SIZE];
- xbt_dict_set(datatype_lookup, get_key(key, datatype_id), datatype, nullptr);
- datatype_id++;
- return datatype_id-1;
+template <typename T> T smpi_f2c(int , xbt_dict_t ) {
+ return NULL;
}
-MPI_Datatype smpi_type_f2c(int datatype) {
+template <> MPI_Datatype smpi_f2c<MPI_Datatype>(int id, xbt_dict_t dict) {
smpi_init_fortran_types();
char key[KEY_SIZE];
- return datatype >= 0 ? static_cast<MPI_Datatype>(xbt_dict_get_or_null(datatype_lookup, get_key(key, datatype))): MPI_DATATYPE_NULL;
-}
-
-static void free_datatype(int datatype) {
- char key[KEY_SIZE];
- xbt_dict_remove(datatype_lookup, get_key(key, datatype));
+ return id >= 0 ? static_cast<MPI_Datatype>(xbt_dict_get_or_null(dict, get_key(key, id))): MPI_DATATYPE_NULL;
}
-int smpi_op_c2f(MPI_Op op) {
- static int op_id = 0;
+template <> MPI_Op smpi_f2c<MPI_Op> (int id, xbt_dict_t dict) {
+ smpi_init_fortran_types();
char key[KEY_SIZE];
- xbt_dict_set(op_lookup, get_key(key, op_id), op, nullptr);
- op_id++;
- return op_id-1;
+ return id >= 0 ? static_cast<MPI_Op>(xbt_dict_get_or_null(dict, get_key(key, id))): MPI_OP_NULL;
}
-MPI_Op smpi_op_f2c(int op) {
+template <> MPI_Info smpi_f2c<MPI_Info>(int id, xbt_dict_t dict) {
smpi_init_fortran_types();
char key[KEY_SIZE];
- return op >= 0 ? static_cast<MPI_Op>(xbt_dict_get_or_null(op_lookup, get_key(key, op))): MPI_OP_NULL;
+ return id >= 0 ? static_cast<MPI_Info>(xbt_dict_get_or_null(dict, get_key(key, id))): MPI_INFO_NULL;
}
-static void free_op(int op) {
+template <> MPI_Win smpi_f2c<MPI_Win>(int id, xbt_dict_t dict) {
+ smpi_init_fortran_types();
char key[KEY_SIZE];
- xbt_dict_remove(op_lookup, get_key(key, op));
+ return id >= 0 ? static_cast<MPI_Win>(xbt_dict_get_or_null(dict, get_key(key, id))): MPI_WIN_NULL;
}
-int smpi_win_c2f(MPI_Win win) {
- static int win_id = 0;
- char key[KEY_SIZE];
- xbt_dict_set(win_lookup, get_key(key, win_id), win, nullptr);
- win_id++;
- return win_id-1;
+template <> MPI_Comm smpi_f2c<MPI_Comm>(int comm, xbt_dict_t dict) {
+ smpi_init_fortran_types();
+ if(comm == -2) {
+ return MPI_COMM_SELF;
+ } else if(comm==0){
+ return MPI_COMM_WORLD;
+ } else if(dict != nullptr && comm >= 0) {
+ char key[KEY_SIZE];
+ MPI_Comm tmp = static_cast<MPI_Comm>(xbt_dict_get_or_null(dict,get_key_id(key, comm)));
+ return tmp != nullptr ? tmp : MPI_COMM_NULL ;
+ } else {
+ return MPI_COMM_NULL;
+ }
}
-MPI_Win smpi_win_f2c(int win) {
+template <> MPI_Group smpi_f2c<MPI_Group>(int group, xbt_dict_t dict) {
smpi_init_fortran_types();
- char key[KEY_SIZE];
- return win >= 0 ? static_cast<MPI_Win>(xbt_dict_get_or_null(win_lookup, get_key(key, win))) : MPI_WIN_NULL;
+ if(group == -2) {
+ return MPI_GROUP_EMPTY;
+ } else if(dict != nullptr && group >= 0) {
+ char key[KEY_SIZE];
+ return static_cast<MPI_Group>(xbt_dict_get_or_null(dict, get_key(key, group)));
+ } else {
+ return MPI_GROUP_NULL;
+ }
}
-static void free_win(int win) {
+template <> MPI_Request smpi_f2c<MPI_Request>(int request, xbt_dict_t dict) {
+ smpi_init_fortran_types();
char key[KEY_SIZE];
- xbt_dict_remove(win_lookup, get_key(key, win));
+ if(request==MPI_FORTRAN_REQUEST_NULL)
+ return MPI_REQUEST_NULL;
+ return static_cast<MPI_Request>(xbt_dict_get(dict, get_key_id(key, request)));
}
-int smpi_info_c2f(MPI_Info info) {
- static int info_id = 0;
- char key[KEY_SIZE];
- xbt_dict_set(info_lookup, get_key(key, info_id), info, nullptr);
- info_id++;
- return info_id-1;
+#define SMPI_F2C_C2F(type, name)\
+int smpi_##name##_add_f(type name){\
+ return smpi_add_f<type>(name, name##_lookup, &name##_id);\
+}\
+int smpi_##name##_c2f(type name){\
+ return smpi_c2f<type>(name, name##_lookup, &name##_id);\
+}\
+static void free_##name(int id) {\
+ free_f<type>(id, name##_lookup);\
+}\
+type smpi_##name##_f2c(int id){\
+ return smpi_f2c<type>(id, name##_lookup);\
}
-MPI_Info smpi_info_f2c(int info) {
- smpi_init_fortran_types();
- char key[KEY_SIZE];
- return info >= 0 ? static_cast<MPI_Info>(xbt_dict_get_or_null(info_lookup, get_key(key, info))) : MPI_INFO_NULL;
-}
+extern "C" { // This should really use the C linkage to be usable from Fortran
-static void free_info(int info) {
- char key[KEY_SIZE];
- xbt_dict_remove(info_lookup, get_key(key, info));
-}
+SMPI_F2C_C2F(MPI_Comm, comm)
+SMPI_F2C_C2F(MPI_Group, group)
+SMPI_F2C_C2F(MPI_Request, request)
+SMPI_F2C_C2F(MPI_Datatype, type)
+SMPI_F2C_C2F(MPI_Win, win)
+SMPI_F2C_C2F(MPI_Op, op)
+SMPI_F2C_C2F(MPI_Info, info)
void mpi_init_(int* ierr) {
smpi_init_fortran_types();
running_processes--;
if(running_processes==0){
xbt_dict_free(&op_lookup);
- xbt_dict_free(&datatype_lookup);
+ xbt_dict_free(&type_lookup);
xbt_dict_free(&request_lookup);
xbt_dict_free(&group_lookup);
xbt_dict_free(&comm_lookup);
*ierr = MPI_Comm_size(smpi_comm_f2c(*comm), size);
}
-double mpi_wtime_(void) {
+double mpi_wtime_() {
return MPI_Wtime();
}
-double mpi_wtick_(void) {
+double mpi_wtick_() {
return MPI_Wtick();
}
*ierr = MPI_Comm_dup(smpi_comm_f2c(*comm), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newcomm = smpi_comm_c2f(tmp);
+ *newcomm = smpi_comm_add_f(tmp);
}
}
*ierr = MPI_Comm_create(smpi_comm_f2c(*comm),smpi_group_f2c(*group), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newcomm = smpi_comm_c2f(tmp);
+ *newcomm = smpi_comm_add_f(tmp);
}
}
*ierr = MPI_Comm_split(smpi_comm_f2c(*comm), *color, *key, &tmp);
if(*ierr == MPI_SUCCESS) {
- *comm_out = smpi_comm_c2f(tmp);
+ *comm_out = smpi_comm_add_f(tmp);
}
}
*ierr = MPI_Group_incl(smpi_group_f2c(*group), *n, ranks, &tmp);
if(*ierr == MPI_SUCCESS) {
- *group_out = smpi_group_c2f(tmp);
+ *group_out = smpi_group_add_f(tmp);
}
}
buf = static_cast<char *>(FORT_BOTTOM(buf));
*ierr = MPI_Send_init(buf, *count, smpi_type_f2c(*datatype), *dst, *tag, smpi_comm_f2c(*comm), &req);
if(*ierr == MPI_SUCCESS) {
- *request = smpi_request_c2f(req);
+ *request = smpi_request_add_f(req);
}
}
buf = static_cast<char *>(FORT_BOTTOM(buf));
*ierr = MPI_Isend(buf, *count, smpi_type_f2c(*datatype), *dst, *tag, smpi_comm_f2c(*comm), &req);
if(*ierr == MPI_SUCCESS) {
- *request = smpi_request_c2f(req);
+ *request = smpi_request_add_f(req);
}
}
buf = static_cast<char *>(FORT_BOTTOM(buf));
*ierr = MPI_Irsend(buf, *count, smpi_type_f2c(*datatype), *dst, *tag, smpi_comm_f2c(*comm), &req);
if(*ierr == MPI_SUCCESS) {
- *request = smpi_request_c2f(req);
+ *request = smpi_request_add_f(req);
}
}
buf = static_cast<char *>( FORT_BOTTOM(buf));
*ierr = MPI_Recv_init(buf, *count, smpi_type_f2c(*datatype), *src, *tag, smpi_comm_f2c(*comm), &req);
if(*ierr == MPI_SUCCESS) {
- *request = smpi_request_c2f(req);
+ *request = smpi_request_add_f(req);
}
}
buf = static_cast<char *>( FORT_BOTTOM(buf));
*ierr = MPI_Irecv(buf, *count, smpi_type_f2c(*datatype), *src, *tag, smpi_comm_f2c(*comm), &req);
if(*ierr == MPI_SUCCESS) {
- *request = smpi_request_c2f(req);
+ *request = smpi_request_add_f(req);
}
}
}
void mpi_testall_ (int* count, int * requests, int *flag, MPI_Status * statuses, int* ierr){
- MPI_Request* reqs;
int i;
- reqs = xbt_new(MPI_Request, *count);
+ MPI_Request* reqs = xbt_new(MPI_Request, *count);
for(i = 0; i < *count; i++) {
reqs[i] = smpi_request_f2c(requests[i]);
}
requests[i]=MPI_FORTRAN_REQUEST_NULL;
}
}
+ xbt_free(reqs);
}
void mpi_get_processor_name_(char *name, int *resultlen, int* ierr){
MPI_Datatype tmp;
*ierr= MPI_Type_vector(*count, *blocklen, *stride, smpi_type_f2c(*old_type), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newtype = smpi_type_c2f(tmp);
+ *newtype = smpi_type_add_f(tmp);
}
}
MPI_Datatype tmp;
*ierr= MPI_Type_vector(*count, *blocklen, *stride, smpi_type_f2c(*old_type), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newtype = smpi_type_c2f(tmp);
+ *newtype = smpi_type_add_f(tmp);
}
}
MPI_Datatype tmp;
*ierr= MPI_Type_hvector (*count, *blocklen, *stride, smpi_type_f2c(*old_type), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newtype = smpi_type_c2f(tmp);
+ *newtype = smpi_type_add_f(tmp);
}
}
MPI_Datatype tmp;
*ierr= MPI_Type_hvector(*count, *blocklen, *stride, smpi_type_f2c(*old_type), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newtype = smpi_type_c2f(tmp);
+ *newtype = smpi_type_add_f(tmp);
}
}
MPI_Datatype tmp= smpi_type_f2c(*datatype);
*ierr= MPI_Type_free (&tmp);
if(*ierr == MPI_SUCCESS) {
- free_datatype(*datatype);
+ free_type(*datatype);
}
}
MPI_Win tmp;
*ierr = MPI_Win_create( static_cast<void*>(base), *size, *disp_unit, smpi_info_f2c(*info), smpi_comm_f2c(*comm),&tmp);
if(*ierr == MPI_SUCCESS) {
- *win = smpi_win_c2f(tmp);
+ *win = smpi_win_add_f(tmp);
}
}
MPI_Info tmp;
*ierr = MPI_Info_create(&tmp);
if(*ierr == MPI_SUCCESS) {
- *info = smpi_info_c2f(tmp);
+ *info = smpi_info_add_f(tmp);
}
}
}
char* tvalue = xbt_new(char,valuelen+1);
strncpy(tvalue, value, valuelen);
-
tvalue[valuelen]='\0';
+
*ierr = MPI_Info_set( smpi_info_f2c(*info), tkey, tvalue);
xbt_free(tkey);
+ xbt_free(tvalue);
}
void mpi_info_get_ (int* info,char *key,int* valuelen, char *value, int *flag, int* ierr, unsigned int keylen ){
MPI_Datatype tmp;
*ierr = MPI_Type_dup(smpi_type_f2c(*datatype), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newdatatype = smpi_type_c2f(tmp);
+ *newdatatype = smpi_type_add_f(tmp);
}
}
MPI_Op tmp;
*ierr = MPI_Op_create(reinterpret_cast<MPI_User_function*>(function),*commute, &tmp);
if(*ierr == MPI_SUCCESS) {
- *op = smpi_op_c2f(tmp);
+ smpi_op_set_fortran(tmp);
+ *op = smpi_op_add_f(tmp);
}
}
MPI_Group tmp;
*ierr = MPI_Group_union(smpi_group_f2c(*group1), smpi_group_f2c(*group2), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newgroup = smpi_group_c2f(tmp);
+ *newgroup = smpi_group_add_f(tmp);
}
}
MPI_Group tmp;
*ierr = MPI_Group_intersection(smpi_group_f2c(*group1), smpi_group_f2c(*group2), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newgroup = smpi_group_c2f(tmp);
+ *newgroup = smpi_group_add_f(tmp);
}
}
MPI_Group tmp;
*ierr = MPI_Group_difference(smpi_group_f2c(*group1), smpi_group_f2c(*group2), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newgroup = smpi_group_c2f(tmp);
+ *newgroup = smpi_group_add_f(tmp);
}
}
MPI_Group tmp;
*ierr = MPI_Group_excl(smpi_group_f2c(*group), *n, ranks, &tmp);
if(*ierr == MPI_SUCCESS) {
- *newgroup = smpi_group_c2f(tmp);
+ *newgroup = smpi_group_add_f(tmp);
}
}
MPI_Group tmp;
*ierr = MPI_Group_range_incl(smpi_group_f2c(*group), *n, ranges, &tmp);
if(*ierr == MPI_SUCCESS) {
- *newgroup = smpi_group_c2f(tmp);
+ *newgroup = smpi_group_add_f(tmp);
}
}
MPI_Group tmp;
*ierr = MPI_Group_range_excl(smpi_group_f2c(*group), *n, ranges, &tmp);
if(*ierr == MPI_SUCCESS) {
- *newgroup = smpi_group_c2f(tmp);
+ *newgroup = smpi_group_add_f(tmp);
}
}
MPI_Comm tmp;
*ierr = MPI_Cart_create(smpi_comm_f2c(*comm_old), *ndims, dims, periods, *reorder, &tmp);
if(*ierr == MPI_SUCCESS) {
- *comm_cart = smpi_comm_c2f(tmp);
+ *comm_cart = smpi_comm_add_f(tmp);
}
}
MPI_Comm tmp;
*ierr = MPI_Cart_sub(smpi_comm_f2c(*comm), remain_dims, &tmp);
if(*ierr == MPI_SUCCESS) {
- *comm_new = smpi_comm_c2f(tmp);
+ *comm_new = smpi_comm_add_f(tmp);
}
}
MPI_Comm tmp;
*ierr = MPI_Graph_create(smpi_comm_f2c(*comm_old), *nnodes, index, edges, *reorder, &tmp);
if(*ierr == MPI_SUCCESS) {
- *comm_graph = smpi_comm_c2f(tmp);
+ *comm_graph = smpi_comm_add_f(tmp);
}
}
MPI_Datatype tmp;
*ierr = MPI_Type_contiguous(*count, smpi_type_f2c(*old_type), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newtype = smpi_type_c2f(tmp);
+ *newtype = smpi_type_add_f(tmp);
}
}
MPI_Datatype tmp;
*ierr = MPI_Type_hindexed(*count, blocklens, indices, smpi_type_f2c(*old_type), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newtype = smpi_type_c2f(tmp);
+ *newtype = smpi_type_add_f(tmp);
}
}
MPI_Datatype tmp;
*ierr = MPI_Type_create_hindexed(*count, blocklens, indices, smpi_type_f2c(*old_type), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newtype = smpi_type_c2f(tmp);
+ *newtype = smpi_type_add_f(tmp);
}
}
MPI_Datatype tmp;
*ierr = MPI_Type_create_hindexed_block(*count, *blocklength, indices, smpi_type_f2c(*old_type), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newtype = smpi_type_c2f(tmp);
+ *newtype = smpi_type_add_f(tmp);
}
}
MPI_Datatype tmp;
*ierr = MPI_Type_indexed(*count, blocklens, indices, smpi_type_f2c(*old_type), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newtype = smpi_type_c2f(tmp);
+ *newtype = smpi_type_add_f(tmp);
}
}
MPI_Datatype tmp;
*ierr = MPI_Type_create_indexed_block(*count, *blocklength, indices, smpi_type_f2c(*old_type), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newtype = smpi_type_c2f(tmp);
+ *newtype = smpi_type_add_f(tmp);
}
}
}
*ierr = MPI_Type_struct(*count, blocklens, indices, types, &tmp);
if(*ierr == MPI_SUCCESS) {
- *newtype = smpi_type_c2f(tmp);
+ *newtype = smpi_type_add_f(tmp);
}
xbt_free(types);
}
}
*ierr = MPI_Type_create_struct(*count, blocklens, indices, types, &tmp);
if(*ierr == MPI_SUCCESS) {
- *newtype = smpi_type_c2f(tmp);
+ *newtype = smpi_type_add_f(tmp);
}
xbt_free(types);
}
MPI_Request tmp;
*ierr = MPI_Ssend_init(buf, *count, smpi_type_f2c(*datatype), *dest, *tag, smpi_comm_f2c(*comm), &tmp);
if(*ierr == MPI_SUCCESS) {
- *request = smpi_request_c2f(tmp);
+ *request = smpi_request_add_f(tmp);
}
}
*ierr = MPI_Intercomm_create(smpi_comm_f2c(*local_comm), *local_leader,smpi_comm_f2c(*peer_comm), *remote_leader,
*tag, &tmp);
if(*ierr == MPI_SUCCESS) {
- *comm_out = smpi_comm_c2f(tmp);
+ *comm_out = smpi_comm_add_f(tmp);
}
}
MPI_Comm tmp;
*ierr = MPI_Intercomm_merge(smpi_comm_f2c(*comm), *high, &tmp);
if(*ierr == MPI_SUCCESS) {
- *comm_out = smpi_comm_c2f(tmp);
+ *comm_out = smpi_comm_add_f(tmp);
}
}
MPI_Request tmp;
*ierr = MPI_Bsend_init(buf, *count, smpi_type_f2c(*datatype), *dest, *tag, smpi_comm_f2c(*comm), &tmp);
if(*ierr == MPI_SUCCESS) {
- *request = smpi_request_c2f(tmp);
+ *request = smpi_request_add_f(tmp);
}
}
MPI_Request tmp;
*ierr = MPI_Ibsend(buf, *count, smpi_type_f2c(*datatype), *dest, *tag, smpi_comm_f2c(*comm), &tmp);
if(*ierr == MPI_SUCCESS) {
- *request = smpi_request_c2f(tmp);
+ *request = smpi_request_add_f(tmp);
}
}
MPI_Request tmp;
*ierr = MPI_Issend(buf, *count, smpi_type_f2c(*datatype), *dest, *tag, smpi_comm_f2c(*comm), &tmp);
if(*ierr == MPI_SUCCESS) {
- *request = smpi_request_c2f(tmp);
+ *request = smpi_request_add_f(tmp);
}
}
MPI_Request tmp;
*ierr = MPI_Rsend_init(buf, *count, smpi_type_f2c(*datatype), *dest, *tag, smpi_comm_f2c(*comm), &tmp);
if(*ierr == MPI_SUCCESS) {
- *request = smpi_request_c2f(tmp);
+ *request = smpi_request_add_f(tmp);
}
}
array_of_distribs, array_of_dargs, array_of_psizes,
*order, smpi_type_f2c(*oldtype), &tmp) ;
if(*ierr == MPI_SUCCESS) {
- *newtype = smpi_type_c2f(tmp);
+ *newtype = smpi_type_add_f(tmp);
}
}
MPI_Datatype tmp;
*ierr = MPI_Type_create_resized(smpi_type_f2c(*oldtype),*lb, *extent, &tmp);
if(*ierr == MPI_SUCCESS) {
- *newtype = smpi_type_c2f(tmp);
+ *newtype = smpi_type_add_f(tmp);
}
}
*ierr = MPI_Type_create_subarray(*ndims,array_of_sizes, array_of_subsizes, array_of_starts, *order,
smpi_type_f2c(*oldtype), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newtype = smpi_type_c2f(tmp);
+ *newtype = smpi_type_add_f(tmp);
}
}
MPI_Comm tmp;
*ierr = MPI_Comm_dup_with_info(smpi_comm_f2c(*comm),smpi_info_f2c(*info),&tmp);
if(*ierr == MPI_SUCCESS) {
- *newcomm = smpi_comm_c2f(tmp);
+ *newcomm = smpi_comm_add_f(tmp);
}
}
MPI_Comm tmp;
*ierr = MPI_Comm_split_type(smpi_comm_f2c(*comm), *split_type, *key, smpi_info_f2c(*info), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newcomm = smpi_comm_c2f(tmp);
+ *newcomm = smpi_comm_add_f(tmp);
}
}
MPI_Info tmp;
*ierr = MPI_Info_dup(smpi_info_f2c(*info), &tmp);
if(*ierr==MPI_SUCCESS){
- *newinfo= smpi_info_c2f(tmp);
+ *newinfo= smpi_info_add_f(tmp);
}
}
*ierr = MPI_Grequest_start( reinterpret_cast<MPI_Grequest_query_function*>(query_fn), reinterpret_cast<MPI_Grequest_free_function*>(free_fn),
reinterpret_cast<MPI_Grequest_cancel_function*>(cancel_fn), extra_state, &tmp);
if(*ierr == MPI_SUCCESS) {
- *request = smpi_request_c2f(tmp);
+ *request = smpi_request_add_f(tmp);
}
}
MPI_Comm tmp;
*ierr = MPI_Comm_connect( port_name, *reinterpret_cast<MPI_Info*>(info), *root, smpi_comm_f2c(*comm), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newcomm = smpi_comm_c2f(tmp);
+ *newcomm = smpi_comm_add_f(tmp);
}
}
MPI_Comm tmp;
*ierr = MPI_Comm_join( *fd, &tmp);
if(*ierr == MPI_SUCCESS) {
- *intercomm = smpi_comm_c2f(tmp);
+ *intercomm = smpi_comm_add_f(tmp);
}
}
MPI_Comm tmp;
*ierr = MPI_Comm_accept( port_name, *reinterpret_cast<MPI_Info*>(info), *root, smpi_comm_f2c(*comm), &tmp);
if(*ierr == MPI_SUCCESS) {
- *newcomm = smpi_comm_c2f(tmp);
+ *newcomm = smpi_comm_add_f(tmp);
}
}
*ierr = MPI_Comm_spawn( command, nullptr, *maxprocs, *reinterpret_cast<MPI_Info*>(info), *root, smpi_comm_f2c(*comm), &tmp,
array_of_errcodes);
if(*ierr == MPI_SUCCESS) {
- *intercomm = smpi_comm_c2f(tmp);
+ *intercomm = smpi_comm_add_f(tmp);
}
}
*ierr = MPI_Comm_spawn_multiple(* count, &array_of_commands, &array_of_argv, array_of_maxprocs,
reinterpret_cast<MPI_Info*>(array_of_info), *root, smpi_comm_f2c(*comm), &tmp, array_of_errcodes);
if(*ierr == MPI_SUCCESS) {
- *intercomm = smpi_comm_c2f(tmp);
+ *intercomm = smpi_comm_add_f(tmp);
}
}
*parent = smpi_comm_c2f(tmp);
}
}
+
+void mpi_file_close_ ( int* file, int* ierr){
+ *ierr= MPI_File_close(reinterpret_cast<MPI_File*>(*file));
+}
+
+void mpi_file_delete_ ( char* filename, int* info, int* ierr){
+ *ierr= MPI_File_delete(filename, smpi_info_f2c(*info));
+}
+
+void mpi_file_open_ ( int* comm, char* filename, int* amode, int* info, int* fh, int* ierr){
+ *ierr= MPI_File_open(smpi_comm_f2c(*comm), filename, *amode, smpi_info_f2c(*info), reinterpret_cast<MPI_File*>(*fh));
+}
+
+void mpi_file_set_view_ ( int* fh, long long int* offset, int* etype, int* filetype, char* datarep, int* info, int* ierr){
+ *ierr= MPI_File_set_view(reinterpret_cast<MPI_File>(*fh) , reinterpret_cast<MPI_Offset>(*offset), smpi_type_f2c(*etype), smpi_type_f2c(*filetype), datarep, smpi_info_f2c(*info));
+}
+
+void mpi_file_read_ ( int* fh, void* buf, int* count, int* datatype, MPI_Status* status, int* ierr){
+ *ierr= MPI_File_read(reinterpret_cast<MPI_File>(*fh), buf, *count, smpi_type_f2c(*datatype), status);
+}
+
+void mpi_file_write_ ( int* fh, void* buf, int* count, int* datatype, MPI_Status* status, int* ierr){
+ *ierr= MPI_File_write(reinterpret_cast<MPI_File>(*fh), buf, *count, smpi_type_f2c(*datatype), status);
+}
+
+} // extern "C"