Skip to content
Snippets Groups Projects
post-process.py 3.33 KiB
#!/usr/bin/env python
"""
Usage:
    post-process.py [options] output-log

Match the sends and recvs across the ranks and output a unified log.

This file is part of SWIFT.

Copyright (C) 2019 Peter W. Draper (p.w.draper@durham.ac.uk)
All Rights Reserved.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

import sys
import argparse

#  Handle the command line.
parser = argparse.ArgumentParser(description="Match MPI reports")

parser.add_argument(
    "input",
    help="Output log from simulator")
parser.add_argument(
    "-v",
    "--verbose",
    dest="verbose",
    help="Verbose output",
    default=False,
    action="store_true",
)
args = parser.parse_args()
infile = args.input

#  Indices for words in a line.
logticcol=0
logcol=1
injcol=2
endcol=3
dticcol=4
stepcol=5
rankcol=6
otherrankcol=7
itypecol=8
isubtypecol=9
tagcol=10
sizecol=11
ntestcol=12
sumcol=13
mincol=14
maxcol=15

#  Keyed lines.
sends = {}
recvs = {}

#  Gather keys from the input log. We created dicts with matchable keys
#  for when sends start and recvs end. Other pairings are possible...
#  Note size of completion recv is negative.
with open(infile, "r") as fp:
    for line in fp:
        if line[0] == '#':
            continue
        words = line.split()
        if words[itypecol] == "22":
            key = words[otherrankcol] + "/" + \
                  words[rankcol] + "/" + \
                  words[isubtypecol] + "/" + \
                  words[tagcol] + "/" + \
                  words[sizecol]
            if not key in sends:
                sends[key] = [line[:-1]]
            else:
                sends[key].append(line[:-1])

        elif words[itypecol] == "23":
            key = words[rankcol] + "/" + \
                  words[otherrankcol] + "/" + \
                  words[isubtypecol] + "/" + \
                  words[tagcol] + "/" + \
                  words[sizecol]
            if not key in recvs:
                recvs[key] = [line[:-1]]
            else:
                recvs[key].append(line[:-1])

#  Now output. Note we could have unmatched recv keys, we don't check for that.
print "# send_logticin send_logtic send_injtic send_endtic send_dtic send_step send_rank send_otherrank send_itype send_isubtype send_tag send_size send_nr_tests send_tsum send_tmin send_tmax recv_logticin recv_logtic recv_injtic recv_endtic recv_dtic recv_step recv_rank recv_otherrank recv_itype recv_isubtype recv_tag recv_size recv_nr_tests recv_tsum recv_tmin recv_tmax"
for key in sends:
    if key in recvs:
        if len(sends[key]) == 1 and len(recvs[key]) == 1:
            print sends[key][0], recvs[key][0]
        else:
            print "# ERROR: found ", len(sends[key]), "/", len(recvs[key]), " matches for key: ", key, " should be 1/1"
    else:
        print "# ERROR: missing recv key: ", key


sys.exit(0)