XBT_LOG_EXTERNAL_CATEGORY(smpi_sender);
XBT_LOG_EXTERNAL_CATEGORY(smpi_util);
-void smpi_process_init(int *argc, char ***argv)
-{
- int index;
- smpi_process_data_t data;
- smx_process_t proc;
-
- proc = SIMIX_process_self();
- index = atoi((*argv)[1]);
- data = smpi_process_remote_data(index);
- SIMIX_process_set_data(proc, data);
- if (*argc > 2) {
- free((*argv)[1]);
- memmove(&(*argv)[1], &(*argv)[2], sizeof(char *) * (*argc - 2));
- (*argv)[(*argc) - 1] = NULL;
- }
- (*argc)--;
- DEBUG2("<%d> New process in the game: %p", index, proc);
-}
-
-void smpi_process_destroy(void)
-{
- int index = smpi_process_index();
-
- DEBUG1("<%d> Process left the game", index);
-}
-
static MPI_Request build_request(void *buf, int count,
MPI_Datatype datatype, int src, int dst,
int tag, MPI_Comm comm, unsigned flags)
smpi_process_post_recv(request);
print_request("New recv", request);
request->pair =
- SIMIX_network_irecv(request->rdv, request->buf, &request->size);
+ SIMIX_req_comm_irecv(request->rdv, request->buf, &request->size);
} else {
smpi_process_post_send(request->comm, request); // FIXME
print_request("New send", request);
request->pair =
- SIMIX_network_isend(request->rdv, request->size, -1.0,
+ SIMIX_req_comm_isend(request->rdv, request->size, -1.0,
request->buf, request->size, NULL);
}
}
status->MPI_SOURCE = (*request)->src;
status->MPI_TAG = (*request)->tag;
status->MPI_ERROR = MPI_SUCCESS;
- status->count = SIMIX_communication_get_dst_buf_size((*request)->pair);
+ status->count = SIMIX_req_comm_get_dst_buff_size((*request)->pair);
}
- SIMIX_communication_destroy((*request)->pair);
+ SIMIX_req_comm_destroy((*request)->pair);
print_request("finishing wait", *request);
if ((*request)->complete == 1) {
- SIMIX_rdv_destroy((*request)->rdv);
+ SIMIX_req_rdv_destroy((*request)->rdv);
} else {
(*request)->match->complete = 1;
(*request)->match->match = MPI_REQUEST_NULL;
void smpi_mpi_wait(MPI_Request * request, MPI_Status * status)
{
print_request("wait", *request);
- SIMIX_network_wait((*request)->pair, -1.0);
+ SIMIX_req_comm_wait((*request)->pair, -1.0);
finish_wait(request, status);
}
}
if (index == MPI_UNDEFINED) {
// Otherwise, wait for a request to complete
- comms = xbt_dynar_new(sizeof(smx_comm_t), NULL);
+ comms = xbt_dynar_new(sizeof(smx_action_t), NULL);
map = xbt_new(int, count);
size = 0;
DEBUG0("Wait for one of");
}
}
if (size > 0) {
- index = SIMIX_network_waitany(comms);
+ index = SIMIX_req_comm_waitany(comms);
index = map[index];
finish_wait(&requests[index], status);
}
void smpi_mpi_waitall(int count, MPI_Request requests[],
MPI_Status status[])
{
- int index;
+ int index, c;
MPI_Status stat;
+ MPI_Status *pstat = status == MPI_STATUS_IGNORE ? MPI_STATUS_IGNORE : &stat;
- while (count > 0) {
- index = smpi_mpi_waitany(count, requests, &stat);
+ c = count;
+ while (c > 0) {
+ index = smpi_mpi_waitany(count, requests, pstat);
if (index == MPI_UNDEFINED) {
break;
}
if (status != MPI_STATUS_IGNORE) {
- memcpy(&status[index], &stat, sizeof(stat));
+ memcpy(&status[index], pstat, sizeof *pstat);
}
- // FIXME: check this -v
- // Move the last request to the found position
- requests[index] = requests[count - 1];
- requests[count - 1] = MPI_REQUEST_NULL;
- count--;
+ c--;
}
}