request->truncated = 0;
request->real_size = 0;
request->real_tag = 0;
+ if(flags & PERSISTENT)
+ request->refcount = 1;
+ else
+ request->refcount = 0;
- request->refcount=1;
#ifdef HAVE_TRACING
request->send = 0;
request->recv = 0;
MPI_Request request = NULL; /* MC needs the comm to be set to NULL during the call */
request = build_request(buf==MPI_BOTTOM ? (void*)0 : buf, count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag,
comm, PERSISTENT | SEND | PREPARED);
- request->refcount++;
return request;
}
MPI_Request request = NULL; /* MC needs the comm to be set to NULL during the call */
request = build_request(buf==MPI_BOTTOM ? (void*)0 : buf, count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag,
comm, PERSISTENT | SSEND | SEND | PREPARED);
- request->refcount++;
return request;
}
MPI_Request request = NULL; /* MC needs the comm to be set to NULL during the call */
request = build_request(buf==MPI_BOTTOM ? (void*)0 : buf, count, datatype, src == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), src), smpi_process_index(), tag,
comm, PERSISTENT | RECV | PREPARED);
- request->refcount++;
return request;
}
xbt_assert(!request->action, "Cannot (re)start a non-finished communication");
request->flags &= ~PREPARED;
+ request->flags &= ~FINISHED;
+ request->refcount++;
+
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 !
*request = MPI_REQUEST_NULL;
}else{
print_request("Decrementing", (*request));
-
}
}else{
xbt_die("freeing an already free request");
{
MPI_Request request = NULL; /* MC needs the comm to be set to NULL during the call */
request = build_request(buf==MPI_BOTTOM ? (void*)0 : buf , count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag,
- comm, NON_PERSISTENT | ISEND | SEND | PREPARED);
+ comm, PERSISTENT | ISEND | SEND | PREPARED);
return request;
}
{
MPI_Request request = NULL; /* MC needs the comm to be set to NULL during the call */
request = build_request(buf==MPI_BOTTOM ? (void*)0 : buf, count, datatype, src == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), src), smpi_process_index(), tag,
- comm, NON_PERSISTENT | RECV | PREPARED);
+ comm, PERSISTENT | RECV | PREPARED);
return request;
}
smpi_irecv_init(recvbuf, recvcount, recvtype, src, recvtag, comm);
smpi_mpi_startall(2, requests);
smpi_mpi_waitall(2, requests, stats);
+ smpi_mpi_request_free(&requests[0]);
+ smpi_mpi_request_free(&requests[1]);
if(status != MPI_STATUS_IGNORE) {
// Copy receive status
*status = stats[1];
MPI_Request req = *request;
smpi_empty_status(status);
- if(!(req->detached && req->flags & SEND) && !(req->flags & PREPARED)){
+ if(!(req->detached && req->flags & SEND)
+ && !(req->flags & PREPARED)){
if(status != MPI_STATUS_IGNORE) {
int src = req->src == MPI_ANY_SOURCE ? req->real_src : req->src;
status->MPI_SOURCE = smpi_group_rank(smpi_comm_group(req->comm), src);
if(req->detached_sender!=NULL){
smpi_mpi_request_free(&(req->detached_sender));
}
-
- if(req->flags & NON_PERSISTENT) {
- smpi_mpi_request_free(request);
- } else {
+ if(req->flags & PERSISTENT)
req->action = NULL;
- }
+ req->flags |= FINISHED;
+
+ smpi_mpi_request_free(request);
+
}
int smpi_mpi_test(MPI_Request * request, MPI_Status * status) {
void smpi_mpi_iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status* status){
MPI_Request request =build_request(NULL, 0, MPI_CHAR, source == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), source), smpi_comm_rank(comm), tag,
- comm, NON_PERSISTENT | RECV);
+ comm, PERSISTENT | RECV);
//to avoid deadlock, we have to sleep some time here, or the timer won't advance and we will only do iprobe simcalls
double sleeptime= sg_cfg_get_double("smpi/iprobe");
size = 0;
XBT_DEBUG("Wait for one of %d", count);
for(i = 0; i < count; i++) {
- if (requests[i] != MPI_REQUEST_NULL && !(requests[i]->flags & PREPARED)) {
+ if (requests[i] != MPI_REQUEST_NULL
+ && !(requests[i]->flags & PREPARED)
+ && !(requests[i]->flags & FINISHED)) {
if (requests[i]->action != NULL) {
XBT_DEBUG("Waiting any %p ", requests[i]);
xbt_dynar_push(comms, &requests[i]->action);
}
}
for(c = 0; c < count; c++) {
+
if (MC_is_active()) {
smpi_mpi_wait(&requests[c], pstat);
index = c;
if(status != MPI_STATUSES_IGNORE) {
status[i] = *pstat;
}
- if (requests[i]->flags & NON_PERSISTENT)
+ if ((requests[i] != MPI_REQUEST_NULL) && requests[i]->flags & NON_PERSISTENT)
requests[i]=MPI_REQUEST_NULL;
}
}else{
// Wait for completion of irecv's.
smpi_mpi_startall(size - 1, requests);
smpi_mpi_waitall(size - 1, requests, MPI_STATUS_IGNORE);
+ for(src = 0; src < size-1; src++) {
+ smpi_mpi_request_free(&requests[src]);
+ }
xbt_free(requests);
}
}
// Wait for completion of irecv's.
smpi_mpi_startall(size - 1, requests);
smpi_mpi_waitall(size - 1, requests, MPI_STATUS_IGNORE);
+ for(src = 0; src < size-1; src++) {
+ smpi_mpi_request_free(&requests[src]);
+ }
xbt_free(requests);
}
}
// Wait for completion of all comms.
smpi_mpi_startall(2 * (size - 1), requests);
smpi_mpi_waitall(2 * (size - 1), requests, MPI_STATUS_IGNORE);
+ for(other = 0; other < 2*(size-1); other++) {
+ smpi_mpi_request_free(&requests[other]);
+ }
xbt_free(requests);
}
// Wait for completion of all comms.
smpi_mpi_startall(2 * (size - 1), requests);
smpi_mpi_waitall(2 * (size - 1), requests, MPI_STATUS_IGNORE);
+ for(other = 0; other < 2*(size-1); other++) {
+ smpi_mpi_request_free(&requests[other]);
+ }
xbt_free(requests);
}
// Wait for completion of isend's.
smpi_mpi_startall(size - 1, requests);
smpi_mpi_waitall(size - 1, requests, MPI_STATUS_IGNORE);
+ for(dst = 0; dst < size-1; dst++) {
+ smpi_mpi_request_free(&requests[dst]);
+ }
xbt_free(requests);
}
}
// Wait for completion of isend's.
smpi_mpi_startall(size - 1, requests);
smpi_mpi_waitall(size - 1, requests, MPI_STATUS_IGNORE);
+ for(dst = 0; dst < size-1; dst++) {
+ smpi_mpi_request_free(&requests[dst]);
+ }
xbt_free(requests);
}
}
XBT_DEBUG("finished waiting any request with index %d", index);
if(index == MPI_UNDEFINED) {
break;
+ }else{
+ smpi_mpi_request_free(&requests[index]);
}
if(op) /* op can be MPI_OP_NULL that does nothing */
smpi_op_apply(op, tmpbufs[index], recvbuf, &count, &datatype);
for(index = 0; index < rank; index++) {
xbt_free(tmpbufs[index]);
}
+ for(index = 0; index < size-1; index++) {
+ smpi_mpi_request_free(&requests[index]);
+ }
xbt_free(tmpbufs);
xbt_free(requests);
}
for(index = 0; index < rank; index++) {
xbt_free(tmpbufs[index]);
}
+ for(index = 0; index < size-1; index++) {
+ smpi_mpi_request_free(&requests[index]);
+ }
xbt_free(tmpbufs);
xbt_free(requests);
}
}
smpi_mpi_startall(tree->numChildren, requests);
smpi_mpi_waitall(tree->numChildren, requests, MPI_STATUS_IGNORE);
+ for(i = 0; i < tree->numChildren; i++) {
+ if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]);
+ }
xbt_free(requests);
}
}
smpi_mpi_startall(tree->numChildren, requests);
smpi_mpi_waitall(tree->numChildren, requests, MPI_STATUS_IGNORE);
+ for(i = 0; i < tree->numChildren; i++) {
+ if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]);
+ }
xbt_free(requests);
}
smpi_mpi_startall(count, requests);
XBT_DEBUG("<%d> wait for %d requests", rank, count);
smpi_mpi_waitall(count, requests, MPI_STATUS_IGNORE);
+ for(i = 0; i < count; i++) {
+ if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]);
+ }
xbt_free(requests);
}
return MPI_SUCCESS;
smpi_mpi_startall(count, requests);
XBT_DEBUG("<%d> wait for %d requests", rank, count);
smpi_mpi_waitall(count, requests, MPI_STATUS_IGNORE);
+ for(i = 0; i < count; i++) {
+ if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]);
+ }
xbt_free(requests);
}
return err;
smpi_mpi_startall(count, requests);
XBT_DEBUG("<%d> wait for %d requests", rank, count);
smpi_mpi_waitall(count, requests, MPI_STATUS_IGNORE);
+ for(i = 0; i < count; i++) {
+ if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]);
+ }
xbt_free(requests);
}
return err;