-
- int rank = request->comm() != MPI_COMM_NULL ? request->comm()->rank() : -1;
-
- MPI_Group group = request->comm()->group();
- int src_traced = group->rank(request->src());
- int dst_traced = group->rank(request->dst());
- int is_wait_for_receive = (request->flags() & RECV);
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
- extra->type = TRACING_WAIT;
- TRACE_smpi_ptp_in(rank, __FUNCTION__, extra);
-
- Request::wait(&request, &status);
-
- TRACE_smpi_ptp_out(rank, dst_traced, __FUNCTION__);
- if (is_wait_for_receive)
- TRACE_smpi_recv(src_traced, dst_traced, 0);
- log_timed_action (action, clock);
-}
-
-static void action_waitall(const char *const *action){
- CHECK_ACTION_PARAMS(action, 0, 0)
- double clock = smpi_process()->simulated_elapsed();
- unsigned int count_requests=get_reqq_self()->size();
-
- if (count_requests>0) {
- MPI_Status status[count_requests];
-
- int rank_traced = smpi_process()->index();
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
- extra->type = TRACING_WAITALL;
- extra->send_size=count_requests;
- TRACE_smpi_ptp_in(rank_traced, __FUNCTION__,extra);
- int recvs_snd[count_requests];
- int recvs_rcv[count_requests];
- unsigned int i=0;
- for (auto req : *(get_reqq_self())){
- if (req && (req->flags () & RECV)){
- recvs_snd[i]=req->src();
- recvs_rcv[i]=req->dst();
- }else
- recvs_snd[i]=-100;
- i++;
- }
- Request::waitall(count_requests, &(*get_reqq_self())[0], status);
-
- for (i=0; i<count_requests;i++){
- if (recvs_snd[i]!=-100)
- TRACE_smpi_recv(recvs_snd[i], recvs_rcv[i],0);
- }
- TRACE_smpi_ptp_out(rank_traced, -1, __FUNCTION__);
- }
- log_timed_action (action, clock);
-}
-
-static void action_barrier(const char *const *action){
- double clock = smpi_process()->simulated_elapsed();
- int rank = smpi_process()->index();
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
- extra->type = TRACING_BARRIER;
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
-
- Colls::barrier(MPI_COMM_WORLD);
-
- TRACE_smpi_collective_out(rank, __FUNCTION__);
- log_timed_action (action, clock);
-}
-
-static void action_bcast(const char *const *action)
-{
- CHECK_ACTION_PARAMS(action, 1, 2)
- double size = parse_double(action[2]);
- double clock = smpi_process()->simulated_elapsed();
- int root=0;
- /* Initialize MPI_CURRENT_TYPE in order to decrease the number of the checks */
- MPI_CURRENT_TYPE= MPI_DEFAULT_TYPE;
-
- if(action[3]) {
- root= atoi(action[3]);
- if(action[4])
- MPI_CURRENT_TYPE=decode_datatype(action[4]);
- }
-
- int rank = smpi_process()->index();
- int root_traced = MPI_COMM_WORLD->group()->index(root);
-
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
- extra->type = TRACING_BCAST;
- extra->send_size = size;
- extra->root = root_traced;
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
- TRACE_smpi_collective_in(rank, __FUNCTION__, extra);
- void *sendbuf = smpi_get_tmp_sendbuffer(size* MPI_CURRENT_TYPE->size());
-
- Colls::bcast(sendbuf, size, MPI_CURRENT_TYPE, root, MPI_COMM_WORLD);
-
- TRACE_smpi_collective_out(rank, __FUNCTION__);
- log_timed_action (action, clock);
-}
-
-static void action_reduce(const char *const *action)
-{
- CHECK_ACTION_PARAMS(action, 2, 2)
- double comm_size = parse_double(action[2]);
- double comp_size = parse_double(action[3]);
- double clock = smpi_process()->simulated_elapsed();
- int root=0;
- MPI_CURRENT_TYPE= MPI_DEFAULT_TYPE;
-
- if(action[4]) {
- root= atoi(action[4]);
- if(action[5])
- MPI_CURRENT_TYPE=decode_datatype(action[5]);
- }
-
- int rank = smpi_process()->index();
- int root_traced = MPI_COMM_WORLD->group()->rank(root);
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
- extra->type = TRACING_REDUCE;
- extra->send_size = comm_size;
- extra->comp_size = comp_size;
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
- extra->root = root_traced;
-
- TRACE_smpi_collective_in(rank, __FUNCTION__,extra);
-
- void *recvbuf = smpi_get_tmp_sendbuffer(comm_size* MPI_CURRENT_TYPE->size());
- void *sendbuf = smpi_get_tmp_sendbuffer(comm_size* MPI_CURRENT_TYPE->size());
- Colls::reduce(sendbuf, recvbuf, comm_size, MPI_CURRENT_TYPE, MPI_OP_NULL, root, MPI_COMM_WORLD);
- smpi_execute_flops(comp_size);
-
- TRACE_smpi_collective_out(rank, __FUNCTION__);
- log_timed_action (action, clock);
-}
-
-static void action_allReduce(const char *const *action) {
- CHECK_ACTION_PARAMS(action, 2, 1)
- double comm_size = parse_double(action[2]);
- double comp_size = parse_double(action[3]);
-
- if(action[4])
- MPI_CURRENT_TYPE=decode_datatype(action[4]);
- else
- MPI_CURRENT_TYPE= MPI_DEFAULT_TYPE;
-
- double clock = smpi_process()->simulated_elapsed();
- int rank = smpi_process()->index();
- instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
- extra->type = TRACING_ALLREDUCE;
- extra->send_size = comm_size;
- extra->comp_size = comp_size;
- extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, nullptr);
- TRACE_smpi_collective_in(rank, __FUNCTION__,extra);
-
- void *recvbuf = smpi_get_tmp_sendbuffer(comm_size* MPI_CURRENT_TYPE->size());
- void *sendbuf = smpi_get_tmp_sendbuffer(comm_size* MPI_CURRENT_TYPE->size());
- Colls::allreduce(sendbuf, recvbuf, comm_size, MPI_CURRENT_TYPE, MPI_OP_NULL, MPI_COMM_WORLD);
- smpi_execute_flops(comp_size);
-
- TRACE_smpi_collective_out(rank, __FUNCTION__);
- log_timed_action (action, clock);
-}
-
-static void action_allToAll(const char *const *action) {
- CHECK_ACTION_PARAMS(action, 2, 2) //two mandatory (send and recv volumes) and two optional (corresponding datatypes)
- double clock = smpi_process()->simulated_elapsed();
- int comm_size = MPI_COMM_WORLD->size();
- int send_size = parse_double(action[2]);
- int recv_size = parse_double(action[3]);
- MPI_Datatype MPI_CURRENT_TYPE2 = MPI_DEFAULT_TYPE;
-
- if(action[4] && action[5]) {
- MPI_CURRENT_TYPE=decode_datatype(action[4]);
- MPI_CURRENT_TYPE2=decode_datatype(action[5]);