X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/077972fd6355b0900d78e4ff0779cf58a5e10e71..1c6196293fc14e4364f8f69f4e3fa47e066c725f:/src/smpi/smpi_f77.c diff --git a/src/smpi/smpi_f77.c b/src/smpi/smpi_f77.c index 647a8abcb7..03e1f24f29 100644 --- a/src/smpi/smpi_f77.c +++ b/src/smpi/smpi_f77.c @@ -60,6 +60,71 @@ static char* get_key_id(char* key, int id) { return key; } + + +static void smpi_init_fortran_types(){ + if(!comm_lookup){ + comm_lookup = xbt_dict_new_homogeneous(NULL); + smpi_comm_c2f(MPI_COMM_WORLD); + group_lookup = xbt_dict_new_homogeneous(NULL); + request_lookup = xbt_dict_new_homogeneous(NULL); + datatype_lookup = xbt_dict_new_homogeneous(NULL); + win_lookup = xbt_dict_new_homogeneous(NULL); + info_lookup = xbt_dict_new_homogeneous(NULL); + smpi_type_c2f(MPI_BYTE); + smpi_type_c2f(MPI_CHAR); + #if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) || defined(__ia64__) + smpi_type_c2f(MPI_INT); + smpi_type_c2f(MPI_INT); + #else + smpi_type_c2f(MPI_LONG); + smpi_type_c2f(MPI_LONG); + #endif + smpi_type_c2f(MPI_INT8_T); + smpi_type_c2f(MPI_INT16_T); + smpi_type_c2f(MPI_INT32_T); + smpi_type_c2f(MPI_INT64_T); + smpi_type_c2f(MPI_FLOAT); + smpi_type_c2f(MPI_FLOAT); + smpi_type_c2f(MPI_DOUBLE); + smpi_type_c2f(MPI_DOUBLE); + smpi_type_c2f(MPI_C_FLOAT_COMPLEX); + smpi_type_c2f(MPI_C_DOUBLE_COMPLEX); + #if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) || defined(__ia64__) + smpi_type_c2f(MPI_2INT); + #else + smpi_type_c2f(MPI_2LONG); + #endif + smpi_type_c2f(MPI_UINT8_T); + smpi_type_c2f(MPI_UINT16_T); + smpi_type_c2f(MPI_UINT32_T); + smpi_type_c2f(MPI_UINT64_T); + smpi_type_c2f(MPI_2FLOAT); + smpi_type_c2f(MPI_2DOUBLE); + smpi_type_c2f(MPI_DOUBLE); + smpi_type_c2f(MPI_DOUBLE); + smpi_type_c2f(MPI_INT); + smpi_type_c2f(MPI_DATATYPE_NULL); + smpi_type_c2f(MPI_DATATYPE_NULL); + smpi_type_c2f(MPI_DATATYPE_NULL); + smpi_type_c2f(MPI_DATATYPE_NULL); + op_lookup = xbt_dict_new_homogeneous(NULL); + 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); + } +} + + int smpi_comm_c2f(MPI_Comm comm) { static int comm_id = 0; char key[KEY_SIZE]; @@ -74,6 +139,7 @@ static void free_comm(int comm) { } MPI_Comm smpi_comm_f2c(int comm) { + smpi_init_fortran_types(); if(comm == -2) { return MPI_COMM_SELF; }else if(comm==0){ @@ -96,6 +162,7 @@ int smpi_group_c2f(MPI_Group group) { } MPI_Group smpi_group_f2c(int group) { + smpi_init_fortran_types(); if(group == -2) { return MPI_GROUP_EMPTY; } else if(group_lookup && group >= 0) { @@ -121,6 +188,7 @@ int smpi_request_c2f(MPI_Request req) { } MPI_Request smpi_request_f2c(int req) { + smpi_init_fortran_types(); char key[KEY_SIZE]; if(req==MPI_FORTRAN_REQUEST_NULL)return MPI_REQUEST_NULL; return (MPI_Request)xbt_dict_get(request_lookup, get_key_id(key, req)); @@ -141,6 +209,7 @@ int smpi_type_c2f(MPI_Datatype datatype) { } MPI_Datatype smpi_type_f2c(int datatype) { + smpi_init_fortran_types(); char key[KEY_SIZE]; return datatype >= 0 ? (MPI_Datatype)xbt_dict_get_or_null(datatype_lookup, get_key(key, datatype)) @@ -161,6 +230,7 @@ int smpi_op_c2f(MPI_Op op) { } MPI_Op smpi_op_f2c(int op) { + smpi_init_fortran_types(); char key[KEY_SIZE]; return op >= 0 ? (MPI_Op)xbt_dict_get_or_null(op_lookup, get_key(key, op)) @@ -181,6 +251,7 @@ int smpi_win_c2f(MPI_Win win) { } MPI_Win smpi_win_f2c(int win) { + smpi_init_fortran_types(); char key[KEY_SIZE]; return win >= 0 ? (MPI_Win)xbt_dict_get_or_null(win_lookup, get_key(key, win)) @@ -202,6 +273,7 @@ int smpi_info_c2f(MPI_Info info) { } MPI_Info smpi_info_f2c(int info) { + smpi_init_fortran_types(); char key[KEY_SIZE]; return info >= 0 ? (MPI_Info)xbt_dict_get_or_null(info_lookup, get_key(key, info)) @@ -213,68 +285,6 @@ static void free_info(int info) { xbt_dict_remove(info_lookup, get_key(key, info)); } -static void smpi_init_fortran_types(){ - if(!comm_lookup){ - comm_lookup = xbt_dict_new_homogeneous(NULL); - smpi_comm_c2f(MPI_COMM_WORLD); - group_lookup = xbt_dict_new_homogeneous(NULL); - request_lookup = xbt_dict_new_homogeneous(NULL); - datatype_lookup = xbt_dict_new_homogeneous(NULL); - win_lookup = xbt_dict_new_homogeneous(NULL); - info_lookup = xbt_dict_new_homogeneous(NULL); - smpi_type_c2f(MPI_BYTE); - smpi_type_c2f(MPI_CHAR); - #if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) || defined(__ia64__) - smpi_type_c2f(MPI_INT); - smpi_type_c2f(MPI_INT); - #else - smpi_type_c2f(MPI_LONG); - smpi_type_c2f(MPI_LONG); - #endif - smpi_type_c2f(MPI_INT8_T); - smpi_type_c2f(MPI_INT16_T); - smpi_type_c2f(MPI_INT32_T); - smpi_type_c2f(MPI_INT64_T); - smpi_type_c2f(MPI_FLOAT); - smpi_type_c2f(MPI_FLOAT); - smpi_type_c2f(MPI_DOUBLE); - smpi_type_c2f(MPI_DOUBLE); - smpi_type_c2f(MPI_C_FLOAT_COMPLEX); - smpi_type_c2f(MPI_C_DOUBLE_COMPLEX); - #if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) || defined(__ia64__) - smpi_type_c2f(MPI_2INT); - #else - smpi_type_c2f(MPI_2LONG); - #endif - smpi_type_c2f(MPI_UINT8_T); - smpi_type_c2f(MPI_UINT16_T); - smpi_type_c2f(MPI_UINT32_T); - smpi_type_c2f(MPI_UINT64_T); - smpi_type_c2f(MPI_2FLOAT); - smpi_type_c2f(MPI_2DOUBLE); - smpi_type_c2f(MPI_DOUBLE); - smpi_type_c2f(MPI_DOUBLE); - smpi_type_c2f(MPI_INT); - smpi_type_c2f(MPI_DATATYPE_NULL); - smpi_type_c2f(MPI_DATATYPE_NULL); - smpi_type_c2f(MPI_DATATYPE_NULL); - smpi_type_c2f(MPI_DATATYPE_NULL); - op_lookup = xbt_dict_new_homogeneous(NULL); - 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); - } -} - void mpi_init_(int* ierr) { smpi_init_fortran_types();