+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
+ TRACE_smpi_computing_in(rank);
+#endif
+
+ log_timed_action (action, clock);
+}
+
+static void action_bcast(const char *const *action)
+{
+ double size = parse_double(action[2]);
+ double clock = smpi_process_simulated_elapsed();
+#ifdef HAVE_TRACING
+ int rank = smpi_comm_rank(MPI_COMM_WORLD);
+ TRACE_smpi_computing_out(rank);
+ int root_traced = smpi_group_rank(smpi_comm_group(MPI_COMM_WORLD), 0);
+ TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__);
+#endif
+
+ smpi_mpi_bcast(NULL, size, MPI_BYTE, 0, MPI_COMM_WORLD);
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__);
+ TRACE_smpi_computing_in(rank);
+#endif
+
+ log_timed_action (action, clock);
+}
+
+static void action_reduce(const char *const *action)
+{
+ double size = parse_double(action[2]);
+ double clock = smpi_process_simulated_elapsed();
+#ifdef HAVE_TRACING
+ int rank = smpi_comm_rank(MPI_COMM_WORLD);
+ TRACE_smpi_computing_out(rank);
+ int root_traced = smpi_group_rank(smpi_comm_group(MPI_COMM_WORLD), 0);
+ TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__);
+#endif
+ smpi_mpi_reduce(NULL, NULL, size, MPI_BYTE, MPI_OP_NULL, 0, MPI_COMM_WORLD);
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__);
+ TRACE_smpi_computing_in(rank);
+#endif
+
+ log_timed_action (action, clock);
+}
+
+static void action_allReduce(const char *const *action) {
+ double comm_size = parse_double(action[2]);
+ double comp_size = parse_double(action[3]);
+ double clock = smpi_process_simulated_elapsed();
+#ifdef HAVE_TRACING
+ int rank = smpi_comm_rank(MPI_COMM_WORLD);
+ TRACE_smpi_computing_out(rank);
+ TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
+#endif
+ smpi_mpi_reduce(NULL, NULL, comm_size, MPI_BYTE, MPI_OP_NULL, 0, MPI_COMM_WORLD);
+ smpi_execute_flops(comp_size);
+ smpi_mpi_bcast(NULL, comm_size, MPI_BYTE, 0, MPI_COMM_WORLD);
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
+ TRACE_smpi_computing_in(rank);
+#endif
+
+ log_timed_action (action, clock);
+}
+
+static void action_allToAll(const char *const *action) {
+ double clock = smpi_process_simulated_elapsed();
+ double comm_size = smpi_comm_size(MPI_COMM_WORLD);
+ double send_size = parse_double(action[2]);
+ double recv_size = parse_double(action[3]);
+
+#ifdef HAVE_TRACING
+ int rank = smpi_process_index();
+ 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(NULL, send_size, MPI_BYTE,
+ NULL, recv_size, MPI_BYTE,
+ MPI_COMM_WORLD);
+ } else if (send_size < 3000) {
+ smpi_coll_tuned_alltoall_basic_linear(NULL, send_size, MPI_BYTE,
+ NULL, recv_size, MPI_BYTE,
+ MPI_COMM_WORLD);
+ } else {
+ smpi_coll_tuned_alltoall_pairwise(NULL, send_size, MPI_BYTE,
+ NULL, recv_size, MPI_BYTE,
+ MPI_COMM_WORLD);
+ }
+
+#ifdef HAVE_TRACING
+ TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
+ TRACE_smpi_computing_in(rank);
+#endif
+
+ log_timed_action (action, clock);
+}
+
+static void action_allToAllv(const char *const *action) {
+ double clock = smpi_process_simulated_elapsed();
+
+ log_timed_action (action, clock);