}
XBT_DEBUG("Send request %p is detached; buf %p copied into %p",request,oldbuf,request->buf);
}
+
// we make a copy here, as the size is modified by simix, and we may reuse the request in another receive later
request->real_size=request->size;
smpi_datatype_use(request->old_type);
void smpi_mpi_ssend(void *buf, int count, MPI_Datatype datatype,
int dst, int tag, MPI_Comm comm)
{
- MPI_Request request = smpi_mpi_issend(buf, count, datatype, dst, tag, comm);
- smpi_mpi_wait(&request, MPI_STATUS_IGNORE);
+ MPI_Request request =
+ build_request(buf, count, datatype, smpi_comm_rank(comm), dst, tag,
+ comm, NON_PERSISTENT | SSEND | SEND);
+
+ smpi_mpi_start(request); smpi_mpi_wait(&request, MPI_STATUS_IGNORE);
}
void smpi_mpi_sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
}
void mpi_init_(int* ierr) {
- comm_lookup = xbt_dynar_new(sizeof(MPI_Comm), NULL);
- new_comm(MPI_COMM_WORLD);
- group_lookup = xbt_dynar_new(sizeof(MPI_Group), NULL);
-
- request_lookup = xbt_dict_new_homogeneous(NULL);
-
- datatype_lookup = xbt_dynar_new(sizeof(MPI_Datatype), NULL);
- new_datatype(MPI_BYTE);
- new_datatype(MPI_CHAR);
- new_datatype(MPI_INT);
- new_datatype(MPI_INT);
- new_datatype(MPI_INT8_T);
- new_datatype(MPI_INT16_T);
- new_datatype(MPI_INT32_T);
- new_datatype(MPI_INT64_T);
- new_datatype(MPI_FLOAT);
- new_datatype(MPI_FLOAT);
- new_datatype(MPI_DOUBLE);
- new_datatype(MPI_DOUBLE);
- new_datatype(MPI_C_FLOAT_COMPLEX);
- new_datatype(MPI_C_DOUBLE_COMPLEX);
- new_datatype(MPI_2INT);
- new_datatype(MPI_UINT8_T);
- new_datatype(MPI_UINT16_T);
- new_datatype(MPI_UINT32_T);
- new_datatype(MPI_UINT64_T);
- new_datatype(MPI_2FLOAT);
- new_datatype(MPI_2DOUBLE);
-
-
- op_lookup = xbt_dynar_new(sizeof(MPI_Op), NULL);
- new_op(MPI_MAX);
- new_op(MPI_MIN);
- new_op(MPI_MAXLOC);
- new_op(MPI_MINLOC);
- new_op(MPI_SUM);
- new_op(MPI_PROD);
- new_op(MPI_LAND);
- new_op(MPI_LOR);
- new_op(MPI_LXOR);
- new_op(MPI_BAND);
- new_op(MPI_BOR);
- new_op(MPI_BXOR);
-
+ if(!comm_lookup){
+ comm_lookup = xbt_dynar_new(sizeof(MPI_Comm), NULL);
+ new_comm(MPI_COMM_WORLD);
+ group_lookup = xbt_dynar_new(sizeof(MPI_Group), NULL);
+
+ request_lookup = xbt_dict_new_homogeneous(NULL);
+
+ datatype_lookup = xbt_dynar_new(sizeof(MPI_Datatype), NULL);
+ new_datatype(MPI_BYTE);
+ new_datatype(MPI_CHAR);
+ new_datatype(MPI_INT);
+ new_datatype(MPI_INT);
+ new_datatype(MPI_INT8_T);
+ new_datatype(MPI_INT16_T);
+ new_datatype(MPI_INT32_T);
+ new_datatype(MPI_INT64_T);
+ new_datatype(MPI_FLOAT);
+ new_datatype(MPI_FLOAT);
+ new_datatype(MPI_DOUBLE);
+ new_datatype(MPI_DOUBLE);
+ new_datatype(MPI_C_FLOAT_COMPLEX);
+ new_datatype(MPI_C_DOUBLE_COMPLEX);
+ new_datatype(MPI_2INT);
+ new_datatype(MPI_UINT8_T);
+ new_datatype(MPI_UINT16_T);
+ new_datatype(MPI_UINT32_T);
+ new_datatype(MPI_UINT64_T);
+ new_datatype(MPI_2FLOAT);
+ new_datatype(MPI_2DOUBLE);
+
+
+ op_lookup = xbt_dynar_new(sizeof(MPI_Op), NULL);
+ new_op(MPI_MAX);
+ new_op(MPI_MIN);
+ new_op(MPI_MAXLOC);
+ new_op(MPI_MINLOC);
+ new_op(MPI_SUM);
+ new_op(MPI_PROD);
+ new_op(MPI_LAND);
+ new_op(MPI_LOR);
+ new_op(MPI_LXOR);
+ new_op(MPI_BAND);
+ new_op(MPI_BOR);
+ new_op(MPI_BXOR);
+ }
/* smpif2c is responsible for generating a call with the final arguments */
*ierr = MPI_Init(NULL, NULL);
}