if(datatype->has_subtype == 1){
// This part handles the problem of non-contiguous memory
old_buf = buf;
- buf = xbt_malloc(count*smpi_datatype_size(datatype));
+ buf = count==0 ? NULL : xbt_malloc(count*smpi_datatype_size(datatype));
if (flags & SEND) {
subtype->serialize(old_buf, buf, count, datatype->substruct);
}
xbt_assert(!request->action,
"Cannot (re)start a non-finished communication");
if(request->flags & RECV) {
- #ifdef HAVE_TRACING
- int rank = smpi_process_index();
- if (TRACE_smpi_view_internals()) {
- TRACE_smpi_computing_out(rank);
- TRACE_smpi_ptp_in(rank, 0, rank, __FUNCTION__);
- }
- #endif
print_request("New recv", request);
if (request->size < sg_cfg_get_int("smpi/async_small_thres"))
mailbox = smpi_process_mailbox_small();
} else {
-
-
-
int receiver = smpi_group_index(smpi_comm_group(request->comm), request->dst);
#ifdef HAVE_TRACING
int rank = smpi_process_index();
if (TRACE_smpi_view_internals()) {
- TRACE_smpi_ptp_in(rank, rank, receiver, __FUNCTION__);
TRACE_smpi_send(rank, rank, receiver);
}
#endif
request->refcount++;
if(request->old_type->has_subtype == 0){
oldbuf = request->buf;
- if (oldbuf){
+ if (oldbuf && request->size!=0){
request->buf = xbt_malloc(request->size);
memcpy(request->buf,oldbuf,request->size);
}
}
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,
}
smpi_datatype_unuse(datatype);
-#ifdef HAVE_TRACING
- if (TRACE_smpi_view_internals()) {
- int rank = smpi_process_index();
- TRACE_smpi_ptp_out(rank, rank, 0, __FUNCTION__);
- }
-#endif
-
}
#ifdef HAVE_TRACING
if (TRACE_smpi_view_internals()) {
- if(req->flags & RECV)
- {
+ if(req->flags & RECV){
int rank = smpi_process_index();
-
- //the src may not have been known at the beginning of the recv (MPI_ANY_SOURCE)
- TRACE_smpi_ptp_out(rank, 0, rank, __FUNCTION__);
- int src_traced = smpi_group_index(smpi_comm_group(req->comm), req->src);
- TRACE_smpi_recv(rank, src_traced, rank);
- TRACE_smpi_computing_in(rank);
- }
+ int src_traced = smpi_group_index(smpi_comm_group(req->comm), req->src == MPI_ANY_SOURCE ? req->real_src : req->src);
+ TRACE_smpi_recv(rank, src_traced, rank);
+ }
}
#endif
else
flag = simcall_comm_test((*request)->action);
if(flag) {
- (*request)->refcount++;
finish_wait(request, status);
+ request=MPI_REQUEST_NULL;
}else{
smpi_empty_status(status);
}
index = smpi_mpi_waitany(count, requests, pstat);
if (index == MPI_UNDEFINED)
break;
+ requests[index]=MPI_REQUEST_NULL;
}
if (status != MPI_STATUSES_IGNORE) {
status[index] = *pstat;
if(status != MPI_STATUSES_IGNORE) {
status[index] = *pstat;
}
+ requests[index]=MPI_REQUEST_NULL;
}else{
return MPI_UNDEFINED;
}
if(status != MPI_STATUSES_IGNORE) {
status[i] = *pstat;
}
+ requests[i]=MPI_REQUEST_NULL;
+
}
}else{
count_dead++;