+ } else if (instr_fmt_type == instr_fmt_TI) {
+ if (extra_ == nullptr)
+ return;
+ instr_extra_data extra = (instr_extra_data)extra_;
+
+ char* process_id = nullptr;
+ // FIXME: dirty extract "rank-" from the name, as we want the bare process id here
+ if (strstr(container->name_, "rank-") == nullptr)
+ process_id = xbt_strdup(container->name_);
+ else
+ process_id = xbt_strdup(container->name_ + 5);
+
+ FILE* trace_file = (FILE*)xbt_dict_get(tracing_files, container->name_);
+
+ switch (extra->type) {
+ case TRACING_INIT:
+ fprintf(trace_file, "%s init\n", process_id);
+ break;
+ case TRACING_FINALIZE:
+ fprintf(trace_file, "%s finalize\n", process_id);
+ break;
+ case TRACING_SEND:
+ fprintf(trace_file, "%s send %d %d %s\n", process_id, extra->dst, extra->send_size, extra->datatype1);
+ break;
+ case TRACING_ISEND:
+ fprintf(trace_file, "%s Isend %d %d %s\n", process_id, extra->dst, extra->send_size, extra->datatype1);
+ break;
+ case TRACING_RECV:
+ fprintf(trace_file, "%s recv %d %d %s\n", process_id, extra->src, extra->send_size, extra->datatype1);
+ break;
+ case TRACING_IRECV:
+ fprintf(trace_file, "%s Irecv %d %d %s\n", process_id, extra->src, extra->send_size, extra->datatype1);
+ break;
+ case TRACING_TEST:
+ fprintf(trace_file, "%s test\n", process_id);
+ break;
+ case TRACING_WAIT:
+ fprintf(trace_file, "%s wait\n", process_id);
+ break;
+ case TRACING_WAITALL:
+ fprintf(trace_file, "%s waitAll\n", process_id);
+ break;
+ case TRACING_BARRIER:
+ fprintf(trace_file, "%s barrier\n", process_id);
+ break;
+ case TRACING_BCAST: // rank bcast size (root) (datatype)
+ fprintf(trace_file, "%s bcast %d ", process_id, extra->send_size);
+ if (extra->root != 0 || (extra->datatype1 && strcmp(extra->datatype1, "")))
+ fprintf(trace_file, "%d %s", extra->root, extra->datatype1);
+ fprintf(trace_file, "\n");
+ break;
+ case TRACING_REDUCE: // rank reduce comm_size comp_size (root) (datatype)
+ fprintf(trace_file, "%s reduce %d %f ", process_id, extra->send_size, extra->comp_size);
+ if (extra->root != 0 || (extra->datatype1 && strcmp(extra->datatype1, "")))
+ fprintf(trace_file, "%d %s", extra->root, extra->datatype1);
+ fprintf(trace_file, "\n");
+ break;
+ case TRACING_ALLREDUCE: // rank allreduce comm_size comp_size (datatype)
+ fprintf(trace_file, "%s allReduce %d %f %s\n", process_id, extra->send_size, extra->comp_size,
+ extra->datatype1);
+ break;
+ case TRACING_ALLTOALL: // rank alltoall send_size recv_size (sendtype) (recvtype)
+ fprintf(trace_file, "%s allToAll %d %d %s %s\n", process_id, extra->send_size, extra->recv_size,
+ extra->datatype1, extra->datatype2);
+ break;
+ case TRACING_ALLTOALLV: // rank alltoallv send_size [sendcounts] recv_size [recvcounts] (sendtype) (recvtype)
+ fprintf(trace_file, "%s allToAllV %d ", process_id, extra->send_size);
+ for (int i = 0; i < extra->num_processes; i++)
+ fprintf(trace_file, "%d ", extra->sendcounts[i]);
+ fprintf(trace_file, "%d ", extra->recv_size);
+ for (int i = 0; i < extra->num_processes; i++)
+ fprintf(trace_file, "%d ", extra->recvcounts[i]);
+ fprintf(trace_file, "%s %s \n", extra->datatype1, extra->datatype2);
+ break;
+ case TRACING_GATHER: // rank gather send_size recv_size root (sendtype) (recvtype)
+ fprintf(trace_file, "%s gather %d %d %d %s %s\n", process_id, extra->send_size, extra->recv_size, extra->root,
+ extra->datatype1, extra->datatype2);
+ break;
+ case TRACING_ALLGATHERV: // rank allgatherv send_size [recvcounts] (sendtype) (recvtype)
+ fprintf(trace_file, "%s allGatherV %d ", process_id, extra->send_size);
+ for (int i = 0; i < extra->num_processes; i++)
+ fprintf(trace_file, "%d ", extra->recvcounts[i]);
+ fprintf(trace_file, "%s %s \n", extra->datatype1, extra->datatype2);
+ break;
+ case TRACING_REDUCE_SCATTER: // rank reducescatter [recvcounts] comp_size (sendtype)
+ fprintf(trace_file, "%s reduceScatter ", process_id);
+ for (int i = 0; i < extra->num_processes; i++)
+ fprintf(trace_file, "%d ", extra->recvcounts[i]);
+ fprintf(trace_file, "%f %s\n", extra->comp_size, extra->datatype1);
+ break;
+ case TRACING_COMPUTING:
+ fprintf(trace_file, "%s compute %f\n", process_id, extra->comp_size);
+ break;
+ case TRACING_SLEEPING:
+ fprintf(trace_file, "%s sleep %f\n", process_id, extra->sleep_duration);
+ break;
+ case TRACING_GATHERV: // rank gatherv send_size [recvcounts] root (sendtype) (recvtype)
+ fprintf(trace_file, "%s gatherV %d ", process_id, extra->send_size);
+ for (int i = 0; i < extra->num_processes; i++)
+ fprintf(trace_file, "%d ", extra->recvcounts[i]);
+ fprintf(trace_file, "%d %s %s\n", extra->root, extra->datatype1, extra->datatype2);
+ break;
+ case TRACING_ALLGATHER: // rank allgather sendcount recvcounts (sendtype) (recvtype)
+ fprintf(trace_file, "%s allGather %d %d %s %s", process_id, extra->send_size, extra->recv_size, extra->datatype1, extra->datatype2);
+ break;
+ case TRACING_WAITANY:
+ case TRACING_SENDRECV:
+ case TRACING_SCATTER:
+ case TRACING_SCATTERV:
+ case TRACING_SCAN:
+ case TRACING_EXSCAN:
+ case TRACING_COMM_SIZE:
+ case TRACING_COMM_SPLIT:
+ case TRACING_COMM_DUP:
+ case TRACING_SSEND:
+ case TRACING_ISSEND:
+ default:
+ XBT_WARN("Call from %s impossible to translate into replay command : Not implemented (yet)", val->name_);
+ break;
+ }
+
+ if (extra->recvcounts != nullptr)
+ xbt_free(extra->recvcounts);
+ if (extra->sendcounts != nullptr)
+ xbt_free(extra->sendcounts);
+ xbt_free(process_id);
+ xbt_free(extra);
+
+ } else {
+ THROW_IMPOSSIBLE;