void smpi_mpi_start(MPI_Request request)
{
smx_rdv_t mailbox;
-
+
xbt_assert(!request->action, "Cannot (re)start a non-finished communication");
request->flags &= ~PREPARED;
request->flags &= ~FINISHED;
if (request->flags & RECV) {
print_request("New recv", request);
- //FIXME: if receive is posted with a large size, but send is smaller, mailboxes may not match !
- if (request->flags & RMA || request->size < sg_cfg_get_int("smpi/async_small_thres"))
+
+ if (request->flags & RMA || request->size < sg_cfg_get_int("smpi/async_small_thres")){
+ //We have to check both mailboxes (because SSEND messages are sent to the large mbox). begin with the more appropriate one : the small one.
mailbox = smpi_process_mailbox_small();
- else
- mailbox = smpi_process_mailbox();
+ XBT_DEBUG("Is there a corresponding send already posted the small mailbox %p (in case of SSEND)?", mailbox);
+ smx_action_t action = simcall_comm_iprobe(mailbox, 0, request->src,request->tag, &match_recv, (void*)request);
+
+ if(action ==NULL){
+ mailbox = smpi_process_mailbox();
+ XBT_DEBUG("No, nothing in the small mailbox test the other one : %p", mailbox);
+ action = simcall_comm_iprobe(mailbox, 0, request->src,request->tag, &match_recv, (void*)request);
+ if(action ==NULL){
+ XBT_DEBUG("Still notching, switch back to the small mailbox : %p", mailbox);
+ mailbox = smpi_process_mailbox_small();
+ }
+ }else{
+ XBT_DEBUG("yes there was something for us in the large mailbox");
+ }
+ }else{
+ mailbox = smpi_process_mailbox_small();
+ XBT_DEBUG("Is there a corresponding send already posted the small mailbox?");
+ smx_action_t action = simcall_comm_iprobe(mailbox, 0, request->src,request->tag, &match_recv, (void*)request);
+
+ if(action ==NULL){
+ XBT_DEBUG("No, nothing in the permanent receive mailbox");
+ mailbox = smpi_process_mailbox();
+ }else{
+ XBT_DEBUG("yes there was something for us in the small mailbox");
+ }
+ }
+
// 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);
&request->real_size, &match_recv,
&smpi_comm_copy_buffer_callback,
request, -1.0);
-
+ XBT_DEBUG("recv simcall posted");
//integrate pseudo-timing for buffering of small messages, do not bother to execute the simcall if 0
double sleeptime = request->detached ? smpi_or(request->size) : 0.0;
if(sleeptime!=0.0){
} else {
- int receiver = request->dst;//smpi_group_index(smpi_comm_group(request->comm), request->dst);
+ int receiver = request->dst;
#ifdef HAVE_TRACING
int rank = request->src;
TRACE_smpi_send(rank, rank, receiver,request->size);
}
#endif
-/* if(receiver == MPI_UNDEFINED) {*/
-/* XBT_WARN("Trying to send a message to a wrong rank");*/
-/* return;*/
-/* }*/
print_request("New send", request);
if (request->flags & RMA || request->size < sg_cfg_get_int("smpi/async_small_thres")) { // eager mode
- mailbox = smpi_process_remote_mailbox_small(receiver);
+ mailbox = smpi_process_remote_mailbox(receiver);
+ XBT_DEBUG("Is there a corresponding recv already posted in the large mailbox %p?", mailbox);
+ smx_action_t action = simcall_comm_iprobe(mailbox, 1,request->dst, request->tag, &match_send, (void*)request);
+ if(action ==NULL){
+ if (! (request->flags & SSEND)){
+ mailbox = smpi_process_remote_mailbox_small(receiver);
+ XBT_DEBUG("No, nothing in the large mailbox, message is to be sent on the small one %p", mailbox);
+ } else{
+ mailbox = smpi_process_remote_mailbox_small(receiver);
+ XBT_DEBUG("SSEND : Is there a corresponding recv already posted in the small mailbox %p?", mailbox);
+ action = simcall_comm_iprobe(mailbox, 1,request->dst, request->tag, &match_send, (void*)request);
+ if(action ==NULL){
+ XBT_DEBUG("No, we are first, send to large mailbox");
+ mailbox = smpi_process_remote_mailbox(receiver);
+ }
+ }
+ }else{
+ XBT_DEBUG("Yes there was something for us in the large mailbox");
+ }
}else{
- XBT_DEBUG("Send request %p is not in the permanent receive mailbox (buf: %p)",request,request->buf);
mailbox = smpi_process_remote_mailbox(receiver);
+ XBT_DEBUG("Send request %p is in the large mailbox %p (buf: %p)",mailbox, request,request->buf);
}
void* buf = request->buf;
&& ((char*)request->buf >= start_data_exe)
&& ((char*)request->buf < start_data_exe + size_data_exe )){
XBT_DEBUG("Privatization : We are sending from a zone inside global memory. Switch data segment ");
- switch_data_segment(request->src);
+ smpi_switch_data_segment(request->src);
}
buf = xbt_malloc(request->size);
memcpy(buf,oldbuf,request->size);
request->real_size=request->size;
smpi_datatype_use(request->old_type);
smpi_comm_use(request->comm);
-
+ request->action =
+ simcall_comm_isend(SIMIX_process_from_PID(request->src+1), mailbox, request->size, -1.0,
+ buf, request->real_size,
+ &match_send,
+ &xbt_free_f, // how to free the userdata if a detached send fails
+ &smpi_comm_copy_buffer_callback,
+ request,
+ // detach if msg size < eager/rdv switch limit
+ request->detached);
+ XBT_DEBUG("send simcall posted");
//if we are giving back the control to the user without waiting for completion, we have to inject timings
double sleeptime = 0.0;
if(request->detached || (request->flags & (ISEND|SSEND))){// issend should be treated as isend
simcall_process_sleep(sleeptime);
XBT_DEBUG("sending size of %zu : sleep %f ", request->size, smpi_os(request->size));
}
- request->action =
- simcall_comm_isend(SIMIX_process_from_PID(request->src+1), mailbox, request->size, -1.0,
- buf, request->real_size,
- &match_send,
- &xbt_free_f, // how to free the userdata if a detached send fails
- &smpi_comm_copy_buffer_callback,
- request,
- // detach if msg size < eager/rdv switch limit
- request->detached);
+
#ifdef HAVE_TRACING
/* FIXME: detached sends are not traceable (request->action == NULL) */
&& ((char*)req->old_buf < start_data_exe + size_data_exe )
){
XBT_VERB("Privatization : We are unserializing to a zone in global memory - Switch data segment ");
- switch_data_segment(smpi_process_index());
+ smpi_switch_data_segment(smpi_process_index());
}
}
if (sg_cfg_get_int("smpi/async_small_thres")>0){
mailbox = smpi_process_mailbox_small();
XBT_DEBUG("trying to probe the perm recv mailbox");
- request->action = simcall_comm_iprobe(mailbox, request->src, request->tag, &match_recv, (void*)request);
+ request->action = simcall_comm_iprobe(mailbox, 0, request->src, request->tag, &match_recv, (void*)request);
}
if (request->action==NULL){
mailbox = smpi_process_mailbox();
XBT_DEBUG("trying to probe the other mailbox");
- request->action = simcall_comm_iprobe(mailbox, request->src, request->tag, &match_recv, (void*)request);
+ request->action = simcall_comm_iprobe(mailbox, 0, request->src,request->tag, &match_recv, (void*)request);
}
if(request->action){