X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/dd3f7131fa6fb84ae9a070c8574ad1f3c0e1611d..8c8892e660c3672d9263394e22fb3a7b040914bc:/src/smpi/smpi_pmpi.c diff --git a/src/smpi/smpi_pmpi.c b/src/smpi/smpi_pmpi.c index 4d8e218ed6..e75d6452f5 100644 --- a/src/smpi/smpi_pmpi.c +++ b/src/smpi/smpi_pmpi.c @@ -478,30 +478,14 @@ int PMPI_Group_difference(MPI_Group group1, MPI_Group group2, MPI_Group * newgro int PMPI_Group_incl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup) { - int retval, i, index; + int retval; if (group == MPI_GROUP_NULL) { retval = MPI_ERR_GROUP; } else if (newgroup == NULL) { retval = MPI_ERR_ARG; } else { - if (n == 0) { - *newgroup = MPI_GROUP_EMPTY; - } else if (n == smpi_group_size(group)) { - *newgroup = group; - if(group!= smpi_comm_group(MPI_COMM_WORLD) - && group != MPI_GROUP_NULL - && group != smpi_comm_group(MPI_COMM_SELF) - && group != MPI_GROUP_EMPTY) - smpi_group_use(group); - } else { - *newgroup = smpi_group_new(n); - for (i = 0; i < n; i++) { - index = smpi_group_index(group, ranks[i]); - smpi_group_set_mapping(*newgroup, index, i); - } - } - retval = MPI_SUCCESS; + retval = smpi_group_incl(group, n, ranks, newgroup); } return retval; } @@ -567,10 +551,12 @@ int PMPI_Group_range_incl(MPI_Group group, int n, int ranges[][3], size = 0; for (i = 0; i < n; i++) { for (rank = ranges[i][0]; /* First */ - rank >= 0; /* Last */ + rank >= 0 && rank < smpi_group_size(group); /* Last */ ) { size++; - + if(rank == ranges[i][1]){/*already last ?*/ + break; + } rank += ranges[i][2]; /* Stride */ if (ranges[i][0] ranges[i][1]) @@ -586,11 +572,14 @@ int PMPI_Group_range_incl(MPI_Group group, int n, int ranges[][3], j = 0; for (i = 0; i < n; i++) { for (rank = ranges[i][0]; /* First */ - rank >= 0; /* Last */ + rank >= 0 && rank < smpi_group_size(group); /* Last */ ) { index = smpi_group_index(group, rank); smpi_group_set_mapping(*newgroup, index, j); j++; + if(rank == ranges[i][1]){/*already last ?*/ + break; + } rank += ranges[i][2]; /* Stride */ if (ranges[i][0] ranges[i][1]) @@ -628,10 +617,12 @@ int PMPI_Group_range_excl(MPI_Group group, int n, int ranges[][3], size = smpi_group_size(group); for (i = 0; i < n; i++) { for (rank = ranges[i][0]; /* First */ - rank >= 0; /* Last */ + rank >= 0 && rank < smpi_group_size(group); /* Last */ ) { size--; - + if(rank == ranges[i][1]){/*already last ?*/ + break; + } rank += ranges[i][2]; /* Stride */ if (ranges[i][0] ranges[i][1]) @@ -651,14 +642,17 @@ int PMPI_Group_range_excl(MPI_Group group, int n, int ranges[][3], while (newrank < size) { add=1; for (i = 0; i < n; i++) { - for (rank = ranges[i][0];rank >= 0;){ + for (rank = ranges[i][0]; + rank >= 0 && rank < smpi_group_size(group); + ){ if(rank==oldrank){ add=0; break; } - + if(rank == ranges[i][1]){/*already last ?*/ + break; + } rank += ranges[i][2]; /* Stride */ - if (ranges[i][0] ranges[i][1]) break; @@ -1691,6 +1685,8 @@ int PMPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm c if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; + } else if (!is_datatype_valid(datatype)) { + retval = MPI_ERR_ARG; } else { #ifdef HAVE_TRACING int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; @@ -1956,10 +1952,13 @@ int PMPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; - } else if (((smpi_comm_rank(comm)==root) && (sendtype == MPI_DATATYPE_NULL)) - || ((recvbuf !=MPI_IN_PLACE) && (recvtype == MPI_DATATYPE_NULL))) { + } else if (((smpi_comm_rank(comm)==root) && (!is_datatype_valid(sendtype))) + || ((recvbuf !=MPI_IN_PLACE) && (!is_datatype_valid(recvtype)))){ retval = MPI_ERR_TYPE; - } else { + } else if ((sendbuf == recvbuf) || + ((smpi_comm_rank(comm)==root) && sendcount>0 && (sendbuf == NULL))){ + retval = MPI_ERR_BUFFER; + }else { if (recvbuf == MPI_IN_PLACE) { recvtype=sendtype; @@ -2730,6 +2729,44 @@ int PMPI_Win_free( MPI_Win* win){ return retval; } +int PMPI_Win_set_name(MPI_Win win, char * name) +{ + int retval = 0; + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_TYPE; + } else if (name == NULL) { + retval = MPI_ERR_ARG; + } else { + smpi_mpi_win_set_name(win, name); + retval = MPI_SUCCESS; + } + return retval; +} + +int PMPI_Win_get_name(MPI_Win win, char * name, int* len) +{ + int retval = MPI_SUCCESS; + + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + } else if (name == NULL) { + retval = MPI_ERR_ARG; + } else { + smpi_mpi_win_get_name(win, name, len); + } + return retval; +} + +int PMPI_Win_get_group(MPI_Win win, MPI_Group * group){ + int retval = MPI_SUCCESS; + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + }else { + smpi_mpi_win_get_group(win, group); + } + return retval; +} + int PMPI_Win_fence( int assert, MPI_Win win){ int retval = 0; @@ -2869,6 +2906,56 @@ int PMPI_Type_get_name(MPI_Datatype datatype, char * name, int* len) return retval; } + +MPI_Datatype PMPI_Type_f2c(MPI_Fint datatype){ + return smpi_type_f2c(datatype); +} + +MPI_Fint PMPI_Type_c2f(MPI_Datatype datatype){ + return smpi_type_c2f( datatype); +} + +MPI_Group PMPI_Group_f2c(MPI_Fint group){ + return smpi_group_f2c( group); +} + +MPI_Fint PMPI_Group_c2f(MPI_Group group){ + return smpi_group_c2f(group); +} + +MPI_Request PMPI_Request_f2c(MPI_Fint request){ + return smpi_request_f2c(request); +} + +MPI_Fint PMPI_Request_c2f(MPI_Request request) { + return smpi_request_c2f(request); +} + +MPI_Win PMPI_Win_f2c(MPI_Fint win){ + return smpi_win_f2c(win); +} + +MPI_Fint PMPI_Win_c2f(MPI_Win win){ + return smpi_win_c2f(win); +} + +MPI_Op PMPI_Op_f2c(MPI_Fint op){ + return smpi_op_f2c(op); +} + +MPI_Fint PMPI_Op_c2f(MPI_Op op){ + return smpi_op_c2f(op); +} + +MPI_Comm PMPI_Comm_f2c(MPI_Fint comm){ + return smpi_comm_f2c(comm); +} + +MPI_Fint PMPI_Comm_c2f(MPI_Comm comm){ + return smpi_comm_c2f(comm); +} + + /* The following calls are not yet implemented and will fail at runtime. */ /* Once implemented, please move them above this notice. */ @@ -2878,6 +2965,21 @@ int PMPI_Type_get_name(MPI_Datatype datatype, char * name, int* len) } +MPI_Info PMPI_Info_f2c(MPI_Fint info){ + NOT_YET_IMPLEMENTED +} + +MPI_Fint PMPI_Info_c2f(MPI_Info info){ + NOT_YET_IMPLEMENTED +} + +MPI_Errhandler PMPI_Errhandler_f2c(MPI_Fint errhandler){ + NOT_YET_IMPLEMENTED +} + +MPI_Fint PMPI_Errhandler_c2f(MPI_Errhandler errhandler){ + NOT_YET_IMPLEMENTED +} int PMPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int* size) { NOT_YET_IMPLEMENTED