Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add TIT trace conversion script
authorMERCIER Michael <michael.mercier@inria.fr>
Thu, 21 Jun 2018 09:20:14 +0000 (11:20 +0200)
committerMERCIER Michael <michael.mercier@inria.fr>
Thu, 21 Jun 2018 09:20:14 +0000 (11:20 +0200)
tools/simgrid_convert_TIT_traces.py [new file with mode: 0755]

diff --git a/tools/simgrid_convert_TIT_traces.py b/tools/simgrid_convert_TIT_traces.py
new file mode 100755 (executable)
index 0000000..0377bec
--- /dev/null
@@ -0,0 +1,110 @@
+#!/usr/bin/env python3
+
+'''
+This script is intended to convert SMPI time independent traces (TIT) from the
+old format (simgrid version <= 3.19) to the new format.
+
+On the previous format each MPI_wait calls were associated to the last ISend of
+IRecv call arbitrarily.
+
+This new that includes tags field that links MPI_wait calls to the
+MPI_ISend or MPI_IRecv associated to this wait.
+
+This script reproduce the old behavior of simgrid because informations are
+missing to add the tags properly.
+
+It takes in input (as argument or in stdin) the trace list file that is only a
+simple text file that contains path of actual TIT files split by rank.
+'''
+
+import os
+import pathlib
+import shutil
+import copy
+
+
+def insert_elem(split_line, position, elem):
+    split_line.insert(position, elem)
+    return " ".join(split_line)
+
+
+def convert_trace(trace_path, base_path, output_path):
+    old_file_path = os.path.join(base_path, trace_path)
+    with open(old_file_path) as trace_file:
+        new_file_path = os.path.join(output_path, trace_path)
+        pathlib.Path(os.path.dirname(new_file_path)).mkdir(
+                parents=True, exist_ok=True)
+        with open(new_file_path, "w") as new_trace:
+            last_async_call_src = None
+            last_async_call_dst = None
+            for line_num, line in enumerate(trace_file.readlines()):
+                #print(line)
+                new_line = None
+                split_line = line.strip().split(" ")
+                mpi_call = split_line[1]
+                if mpi_call == "recv" or mpi_call == "send":
+                    new_line = insert_elem(split_line, 3, "0")
+                if mpi_call == "Irecv" or mpi_call == "Isend":
+                    last_async_call_src = split_line[0]
+                    last_async_call_dst = split_line[2]
+                    new_line = insert_elem(split_line, 3, "0")
+                    # print("found async call in line: "+ str(line_num))
+                # print("mpi_call: " + mpi_call)
+                if mpi_call == "wait":
+                    # print("found wait call in line: "+ str(line_num))
+                    if (last_async_call_src is None
+                            or last_async_call_dst is None):
+                        raise Exception("Invalid traces: No Isend or Irecv "
+                                "found before the wait in line " +
+                                str(line_num) + " in file " + old_file_path )
+                    new_line = insert_elem(split_line, 2, last_async_call_src)
+                    new_line = insert_elem(split_line, 3, last_async_call_dst)
+                    new_line = insert_elem(split_line, 4, "0")
+
+                if new_line is not None:
+                    # print("line: "+ str(line_num) + " in file " + old_file_path +
+                    #        " processed\n:OLD: " + line + "\n:NEW: " + new_line)
+                    new_trace.write(new_line + "\n")
+                else:
+                    new_trace.write(line)
+
+
+if __name__ == "__main__":
+    import argparse
+    import pathlib
+    import sys
+
+
+    parser = argparse.ArgumentParser(description=__doc__)
+
+    parser.add_argument('trace_list_file', type=argparse.FileType('r'),
+            default=sys.stdin, help="the trace list file")
+
+    parser.add_argument('--output_path', '-o', default="converted_traces",
+            help="the path where converted traces will be put")
+
+    args = parser.parse_args()
+
+    trace_list_file_path = args.trace_list_file.name
+
+    # creates results dir
+    pathlib.Path(args.output_path).mkdir(
+            parents=True, exist_ok=True)
+
+    # copy trace list file
+    shutil.copy(trace_list_file_path, args.output_path)
+
+    with open(trace_list_file_path) as tracelist_file:
+        trace_list = tracelist_file.readlines()
+
+    # get based path relative to trace list file
+    base_path = os.path.dirname(trace_list_file_path)
+
+    trace_list = [x.strip() for x in trace_list]
+
+    # process trace files
+    [convert_trace(trace_path, base_path, args.output_path)
+            for trace_path in trace_list]
+
+    print("Done!")
+    print("Result in:\n" + args.output_path)