- TRACE_smpi_computing_out(rank);
- TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
-#endif
-
- if (send_size < 200 && comm_size > 12) {
- smpi_coll_tuned_alltoall_bruck(send, send_size, MPI_CURRENT_TYPE,
- recv, recv_size, MPI_CURRENT_TYPE,
- MPI_COMM_WORLD);
- } else if (send_size < 3000) {
- smpi_coll_tuned_alltoall_basic_linear(send, send_size, MPI_CURRENT_TYPE,
- recv, recv_size, MPI_CURRENT_TYPE,
- MPI_COMM_WORLD);
+ instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
+ extra->type = TRACING_ALLTOALL;
+ extra->send_size = send_size;
+ extra->recv_size = recv_size;
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, NULL);
+ extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2, NULL);
+
+ TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra);
+
+ mpi_coll_alltoall_fun(send, send_size, MPI_CURRENT_TYPE, recv, recv_size, MPI_CURRENT_TYPE2, MPI_COMM_WORLD);
+
+ TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
+ log_timed_action (action, clock);
+}
+
+
+static void action_gather(const char *const *action) {
+ /*
+ The structure of the gather action for the rank 0 (total 4 processes)
+ is the following:
+ 0 gather 68 68 0 0 0
+
+ where:
+ 1) 68 is the sendcounts
+ 2) 68 is the recvcounts
+ 3) 0 is the root node
+ 4) 0 is the send datatype id, see decode_datatype()
+ 5) 0 is the recv datatype id, see decode_datatype()
+ */
+ CHECK_ACTION_PARAMS(action, 2, 3);
+ double clock = smpi_process_simulated_elapsed();
+ int comm_size = smpi_comm_size(MPI_COMM_WORLD);
+ int send_size = parse_double(action[2]);
+ int recv_size = parse_double(action[3]);
+ MPI_Datatype MPI_CURRENT_TYPE2;
+ if(action[5]) {
+ MPI_CURRENT_TYPE=decode_datatype(action[5]);
+ MPI_CURRENT_TYPE2=decode_datatype(action[6]);
+ } else {
+ MPI_CURRENT_TYPE=MPI_DEFAULT_TYPE;
+ MPI_CURRENT_TYPE2=MPI_DEFAULT_TYPE;
+ }
+ void *send = smpi_get_tmp_sendbuffer(send_size* smpi_datatype_size(MPI_CURRENT_TYPE));
+ void *recv = NULL;
+ int root=0;
+ if(action[4])
+ root=atoi(action[4]);
+ int rank = smpi_comm_rank(MPI_COMM_WORLD);
+
+ if(rank==root)
+ recv = smpi_get_tmp_recvbuffer(recv_size*comm_size* smpi_datatype_size(MPI_CURRENT_TYPE2));
+
+ instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
+ extra->type = TRACING_GATHER;
+ extra->send_size = send_size;
+ extra->recv_size = recv_size;
+ extra->root = root;
+ extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE, NULL);
+ extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2, NULL);
+
+ TRACE_smpi_collective_in(smpi_process_index(), root, __FUNCTION__, extra);
+
+ mpi_coll_gather_fun(send, send_size, MPI_CURRENT_TYPE,
+ recv, recv_size, MPI_CURRENT_TYPE2,
+ root, MPI_COMM_WORLD);
+
+ TRACE_smpi_collective_out(smpi_process_index(), -1, __FUNCTION__);
+ log_timed_action (action, clock);
+}
+
+
+
+static void action_gatherv(const char *const *action) {
+ /*
+ The structure of the gatherv action for the rank 0 (total 4 processes)
+ is the following:
+ 0 gather 68 68 10 10 10 0 0 0
+
+ where:
+ 1) 68 is the sendcount
+ 2) 68 10 10 10 is the recvcounts
+ 3) 0 is the root node
+ 4) 0 is the send datatype id, see decode_datatype()
+ 5) 0 is the recv datatype id, see decode_datatype()
+ */
+
+ double clock = smpi_process_simulated_elapsed();
+ int comm_size = smpi_comm_size(MPI_COMM_WORLD);
+ CHECK_ACTION_PARAMS(action, comm_size+1, 2);
+ int send_size = parse_double(action[2]);
+ int *disps = xbt_new0(int, comm_size);
+ int *recvcounts = xbt_new0(int, comm_size);
+ int i=0,recv_sum=0;
+
+ MPI_Datatype MPI_CURRENT_TYPE2;
+ if(action[4+comm_size]) {
+ MPI_CURRENT_TYPE=decode_datatype(action[4+comm_size]);
+ MPI_CURRENT_TYPE2=decode_datatype(action[5+comm_size]);