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);
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) {
+int smpi_comm_add_f(MPI_Comm comm) {
static int comm_id = 0;
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);
return comm_id-1;
}
+int smpi_comm_c2f(MPI_Comm comm) {
+ char* existing_key = xbt_dict_get_key(comm_lookup, comm);
+ if(existing_key!=nullptr)
+ return atoi(existing_key);
+ else
+ return smpi_comm_add_f(comm);
+}
+
static void free_comm(int comm) {
char key[KEY_SIZE];
xbt_dict_remove(comm_lookup, comm==0? get_key(key, comm) : get_key_id(key, comm));
}
}
-int smpi_group_c2f(MPI_Group group) {
+int smpi_group_add_f(MPI_Group group) {
static int group_id = 0;
char key[KEY_SIZE];
xbt_dict_set(group_lookup, get_key(key, group_id), group, nullptr);
return group_id-1;
}
+int smpi_group_c2f(MPI_Group group) {
+ char* existing_key = xbt_dict_get_key(group_lookup, group);
+ if(existing_key!=nullptr)
+ return atoi(existing_key);
+ else
+ return smpi_group_add_f(group);
+}
+
MPI_Group smpi_group_f2c(int group) {
smpi_init_fortran_types();
if(group == -2) {
xbt_dict_remove(group_lookup, get_key(key, group));
}
-int smpi_request_c2f(MPI_Request req) {
+int smpi_request_add_f(MPI_Request request) {
static int request_id = 0;
char key[KEY_SIZE];
- xbt_dict_set(request_lookup, get_key_id(key, request_id), req, nullptr);
+ xbt_dict_set(request_lookup, get_key_id(key, request_id), request, nullptr);
request_id++;
return request_id-1;
}
-MPI_Request smpi_request_f2c(int req) {
+int smpi_request_c2f(MPI_Request request) {
+ char* existing_key = xbt_dict_get_key(request_lookup, request);
+ if(existing_key!=nullptr)
+ return atoi(existing_key);
+ else
+ return smpi_request_add_f(request);
+}
+
+MPI_Request smpi_request_f2c(int request) {
smpi_init_fortran_types();
char key[KEY_SIZE];
- if(req==MPI_FORTRAN_REQUEST_NULL)
+ if(request==MPI_FORTRAN_REQUEST_NULL)
return MPI_REQUEST_NULL;
- return static_cast<MPI_Request>(xbt_dict_get(request_lookup, get_key_id(key, req)));
+ return static_cast<MPI_Request>(xbt_dict_get(request_lookup, get_key_id(key, request)));
}
static void free_request(int request) {
int smpi_type_c2f(MPI_Datatype datatype) {
char* existing_key = xbt_dict_get_key(datatype_lookup, datatype);
- return atoi(existing_key);
+ if(existing_key!=nullptr)
+ return atoi(existing_key);
+ else
+ return smpi_type_add_f(datatype);
}
MPI_Datatype smpi_type_f2c(int datatype) {
xbt_dict_remove(datatype_lookup, get_key(key, datatype));
}
-int smpi_op_c2f(MPI_Op op) {
+int smpi_op_add_f(MPI_Op op) {
static int op_id = 0;
char key[KEY_SIZE];
xbt_dict_set(op_lookup, get_key(key, op_id), op, nullptr);
return op_id-1;
}
+int smpi_op_c2f(MPI_Op op) {
+ char* existing_key = xbt_dict_get_key(op_lookup, op);
+ if(existing_key!=nullptr)
+ return atoi(existing_key);
+ else
+ return smpi_op_add_f(op);
+}
+
MPI_Op smpi_op_f2c(int op) {
smpi_init_fortran_types();
char key[KEY_SIZE];
xbt_dict_remove(op_lookup, get_key(key, op));
}
-int smpi_win_c2f(MPI_Win win) {
+int smpi_win_add_f(MPI_Win win) {
static int win_id = 0;
char key[KEY_SIZE];
xbt_dict_set(win_lookup, get_key(key, win_id), win, nullptr);
return win_id-1;
}
+int smpi_win_c2f(MPI_Win win) {
+ char* existing_key = xbt_dict_get_key(win_lookup, win);
+ if(existing_key!=nullptr)
+ return atoi(existing_key);
+ else
+ return smpi_win_add_f(win);
+}
+
MPI_Win smpi_win_f2c(int win) {
smpi_init_fortran_types();
char key[KEY_SIZE];
xbt_dict_remove(win_lookup, get_key(key, win));
}
-int smpi_info_c2f(MPI_Info info) {
+int smpi_info_add_f(MPI_Info info) {
static int info_id = 0;
char key[KEY_SIZE];
xbt_dict_set(info_lookup, get_key(key, info_id), info, nullptr);
return info_id-1;
}
+int smpi_info_c2f(MPI_Info info) {
+ char* existing_key = xbt_dict_get_key(info_lookup, info);
+ if(existing_key!=nullptr)
+ return atoi(existing_key);
+ else
+ return smpi_info_add_f(info);
+}
+
MPI_Info smpi_info_f2c(int info) {
smpi_init_fortran_types();
char key[KEY_SIZE];
*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);
}
}
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);
}
}
*ierr = MPI_Op_create(reinterpret_cast<MPI_User_function*>(function),*commute, &tmp);
if(*ierr == MPI_SUCCESS) {
smpi_op_set_fortran(tmp);
- *op = smpi_op_c2f(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_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);
}
}
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);
}
}