Beispiel #1
0
def process_appker_output(appstdout=None, stdout=None, stderr=None, geninfo=None, resource_appker_vars=None):
    # set App Kernel Description
    parser = AppKerOutputParser(
        name='graph500',
        version=1,
        description="Graph500 Benchmark",
        url='http://www.Graph500.org',
        measurement_name='Graph500'
    )
    # set obligatory parameters and statistics
    # set common parameters and statistics
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('App:Version')
    parser.add_must_have_parameter('Edge Factor')
    parser.add_must_have_parameter('Input File')
    parser.add_must_have_parameter('Number of Roots to Check')
    parser.add_must_have_parameter('Number of Edges')
    parser.add_must_have_parameter('Number of Vertices')
    parser.add_must_have_parameter('Scale')

    parser.add_must_have_statistic('Harmonic Mean TEPS')
    parser.add_must_have_statistic('Harmonic Standard Deviation TEPS')
    parser.add_must_have_statistic('Median TEPS')
    parser.add_must_have_statistic('Wall Clock Time')

    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo, resource_appker_vars)

    if parser.appKerWallClockTime is not None:
        parser.set_statistic("Wall Clock Time", total_seconds(parser.appKerWallClockTime), "Second")
    elif parser.wallClockTime is not None:
        parser.set_statistic("Wall Clock Time", total_seconds(parser.wallClockTime), "Second")

    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # process the output
    parser.successfulRun = True
    num_of_errors = 0
    j = 0
    while j < len(lines):
        m = re.match(r'^Graph500 version:\s+(.+)', lines[j])
        if m:
            parser.set_parameter("App:Version", m.group(1).strip())

        m = re.match(r'ERROR:\s+(.+)', lines[j])
        if m:
            num_of_errors += 1

        m = re.match(r'^Reading input from\s+(.+)', lines[j])
        if m:
            parser.set_parameter("Input File", m.group(1))

        m = re.match(r'^SCALE:\s+(\d+)', lines[j])
        if m:
            parser.set_parameter("Scale", m.group(1))

        m = re.match(r'^edgefactor:\s+(\d+)', lines[j])
        if m:
            parser.set_parameter("Edge Factor", m.group(1))

        m = re.match(r'^NBFS:\s+(\d+)', lines[j])
        if m:
            parser.set_parameter("Number of Roots to Check", m.group(1))

        m = re.match(r'^median_TEPS:\s+(\d[0-9.e+]+)', lines[j])
        if m:
            parser.set_statistic("Median TEPS", m.group(1), "Traversed Edges Per Second")

        m = re.match(r'^harmonic_mean_TEPS:\s+(\d[0-9.e+]+)', lines[j])
        if m:
            parser.successfulRun = True
            parser.set_statistic("Harmonic Mean TEPS", m.group(1), "Traversed Edges Per Second")

        m = re.match(r'^harmonic_stddev_TEPS:\s+(\d[0-9.e+]+)', lines[j])
        if m:
            parser.set_statistic("Harmonic Standard Deviation TEPS", m.group(1), "Traversed Edges Per Second")

        m = re.match(r'^median_validate:\s+([\d.]+)\s+s', lines[j])
        if m:
            parser.set_statistic("Median Validation Time", m.group(1), "Second")

        m = re.match(r'^mean_validate:\s+([\d.]+)\s+s', lines[j])
        if m:
            parser.set_statistic("Mean Validation Time", m.group(1), "Second")

        m = re.match(r'^stddev_validate:\s+([\d.]+)\s+s', lines[j])
        if m:
            parser.set_statistic("Standard Deviation Validation Time", m.group(1), "Second")

        j += 1

    if num_of_errors > 0:
        parser.successfulRun = False

    if parser.get_parameter('Scale') is not None and parser.get_parameter('Edge Factor') is not None:
        scale = int(parser.get_parameter('Scale'))
        edgefactor = int(parser.get_parameter('Edge Factor'))
        parser.set_parameter("Number of Vertices", 2 ** scale)
        parser.set_parameter("Number of Edges", edgefactor * 2 ** scale)

    if __name__ == "__main__":
        # output for testing purpose
        parser.parsing_complete(True)
        print("parsing complete:", parser.parsing_complete())
        parser.print_params_stats_as_must_have()
        print(parser.get_xml())

    # return complete XML overwize return None
    return parser.get_xml()
Beispiel #2
0
def process_appker_output(appstdout=None,
                          stdout=None,
                          stderr=None,
                          geninfo=None,
                          resource_appker_vars=None):
    # set App Kernel Description
    parser = AppKerOutputParser(
        name='gromacs_micro',
        version=1,
        description="GROMACS: micro-benchmark for testing purposes",
        url='http://www.gromacs.org/',
        measurement_name='GROMACS-Micro')
    # set obligatory parameters and statistics
    # set common parameters and statistics
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('App:Version')

    parser.add_must_have_statistic('Simulation Speed')
    parser.add_must_have_statistic('Wall Clock Time')

    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo,
                                         resource_appker_vars)

    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # process the output
    successful_run = False
    j = 0
    while j < len(lines):
        m = re.search(r'^GROMACS:\s+ gmx mdrun, version\s+(\S+)$', lines[j])
        if m:
            parser.set_parameter("App:Version", m.group(1))

        m = re.search(r'^Performance: \s+([0-9.]+)', lines[j])
        if m:
            parser.set_statistic("Simulation Speed", float(m.group(1)),
                                 "ns/day")

        m = re.search(r'^ \s+Time: \s+([0-9.]+) \s+([0-9.]+)', lines[j])
        if m:
            parser.set_statistic("Wall Clock Time", m.group(2), "Second")
            parser.set_statistic("Core Clock Time", m.group(1), "Second")

        m = re.match(r'^GROMACS reminds you', lines[j])
        if m:
            successful_run = True

        j += 1

    parser.successfulRun = successful_run

    if __name__ == "__main__":
        # output for testing purpose
        print("parsing complete:", parser.parsing_complete())
        parser.print_params_stats_as_must_have()
        print(parser.get_xml())

    # return complete XML overwize return None
    return parser.get_xml()
Beispiel #3
0
def process_appker_output(appstdout=None,
                          stdout=None,
                          stderr=None,
                          geninfo=None,
                          proclog=None,
                          resource_appker_vars=None):
    # initiate parser
    parser = AppKerOutputParser(name='mdtest')
    # set obligatory parameters and statistics
    # set common parameters and statistics (App:ExeBinSignature and RunEnv:Nodes)
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('RunEnv:Nodes')

    parser.add_must_have_parameter('Arguments (single directory per process)')
    parser.add_must_have_parameter('Arguments (single directory)')
    parser.add_must_have_parameter(
        'Arguments (single tree directory per process)')
    parser.add_must_have_parameter('Arguments (single tree directory)')
    parser.add_must_have_parameter(
        'files/directories (single directory per process)')
    parser.add_must_have_parameter('files/directories (single directory)')
    parser.add_must_have_parameter(
        'files/directories (single tree directory per process)')
    parser.add_must_have_parameter('files/directories (single tree directory)')
    parser.add_must_have_parameter('tasks (single directory per process)')
    parser.add_must_have_parameter('tasks (single directory)')
    parser.add_must_have_parameter('tasks (single tree directory per process)')
    parser.add_must_have_parameter('tasks (single tree directory)')

    parser.add_must_have_statistic(
        'Directory creation (single directory per process)')
    parser.add_must_have_statistic('Directory creation (single directory)')
    parser.add_must_have_statistic(
        'Directory creation (single tree directory per process)')
    parser.add_must_have_statistic(
        'Directory creation (single tree directory)')
    parser.add_must_have_statistic(
        'Directory removal (single directory per process)')
    parser.add_must_have_statistic('Directory removal (single directory)')
    parser.add_must_have_statistic(
        'Directory removal (single tree directory per process)')
    parser.add_must_have_statistic('Directory removal (single tree directory)')
    parser.add_must_have_statistic(
        'Directory stat (single directory per process)')
    parser.add_must_have_statistic('Directory stat (single directory)')
    parser.add_must_have_statistic(
        'Directory stat (single tree directory per process)')
    parser.add_must_have_statistic('Directory stat (single tree directory)')
    parser.add_must_have_statistic(
        'File creation (single directory per process)')
    parser.add_must_have_statistic('File creation (single directory)')
    parser.add_must_have_statistic(
        'File creation (single tree directory per process)')
    parser.add_must_have_statistic('File creation (single tree directory)')
    parser.add_must_have_statistic('File read (single directory per process)')
    parser.add_must_have_statistic('File read (single directory)')
    parser.add_must_have_statistic(
        'File read (single tree directory per process)')
    parser.add_must_have_statistic('File read (single tree directory)')
    parser.add_must_have_statistic(
        'File removal (single directory per process)')
    parser.add_must_have_statistic('File removal (single directory)')
    parser.add_must_have_statistic(
        'File removal (single tree directory per process)')
    parser.add_must_have_statistic('File removal (single tree directory)')
    parser.add_must_have_statistic('File stat (single directory per process)')
    parser.add_must_have_statistic('File stat (single directory)')
    parser.add_must_have_statistic(
        'File stat (single tree directory per process)')
    parser.add_must_have_statistic('File stat (single tree directory)')
    parser.add_must_have_statistic(
        'Tree creation (single directory per process)')
    parser.add_must_have_statistic('Tree creation (single directory)')
    parser.add_must_have_statistic(
        'Tree creation (single tree directory per process)')
    parser.add_must_have_statistic('Tree creation (single tree directory)')
    parser.add_must_have_statistic(
        'Tree removal (single directory per process)')
    parser.add_must_have_statistic('Tree removal (single directory)')
    parser.add_must_have_statistic(
        'Tree removal (single tree directory per process)')
    parser.add_must_have_statistic('Tree removal (single tree directory)')

    parser.add_must_have_statistic('Wall Clock Time')

    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo,
                                         resource_appker_vars)

    if hasattr(parser, 'appKerWallClockTime'):
        parser.set_statistic("Wall Clock Time",
                             total_seconds(parser.appKerWallClockTime),
                             "Second")

    # Here can be custom output parsing
    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # process the output
    testname = ""
    parser.successfulRun = False
    j = 0
    while j < len(lines):
        m = re.match(r'^#Testing (.+)', lines[j])
        if m:
            testname = " (" + m.group(1).strip() + ")"

        m = re.match(r'^SUMMARY.*:', lines[j])
        if m:
            j = j + 3
            while j < len(lines):
                m = re.match(
                    r'([A-Za-z0-9 ]+):\s+[0-9.]+\s+[0-9.]+\s+([0-9.]+)\s+([0-9.]+)',
                    lines[j])
                if m:
                    parser.set_statistic(
                        m.group(1).strip() + testname, m.group(2),
                        "Operations/Second")
                else:
                    break
                j = j + 1
        m = re.search(r'finished at', lines[j])
        if m:
            parser.successfulRun = True

        m = re.match(r'^Command line used:.+mdtest\s+(.+)', lines[j])

        if m:
            parser.set_parameter("Arguments" + testname, m.group(1).strip())
        m = re.search(r'([0-9]+) tasks, ([0-9]+) files/directories', lines[j])
        if m:
            parser.set_parameter("tasks" + testname, m.group(1).strip())
            parser.set_parameter("files/directories" + testname,
                                 m.group(2).strip())
        j = j + 1

        # parser.set_parameter("mega parameter",m.group(1))
    #
    #         m=re.search(r'My mega parameter\s+(\d+)',lines[j])
    #         if m:parser.set_statistic("mega statistics",m.group(1),"Seconds")
    #
    #         m=re.search(r'Done',lines[j])
    #         if m:parser.successfulRun=True
    #
    #         j+=1

    if __name__ == "__main__":
        # output for testing purpose
        print("Parsing complete:", parser.parsing_complete(verbose=True))
        print("Following statistics and parameter can be set as obligatory:")
        parser.print_params_stats_as_must_have()
        print("\nResulting XML:")
        print(parser.get_xml())

    # return complete XML otherwise return None
    return parser.get_xml()
Beispiel #4
0
def process_appker_output(appstdout=None,
                          stdout=None,
                          stderr=None,
                          geninfo=None,
                          resource_appker_vars=None):
    # set App Kernel Description
    parser = AppKerOutputParser(
        name='nwchem',
        version=1,
        description="NWChem: Northwest Computational Chemistry Package",
        url='http://www.emsl.pnl.gov/docs/nwchem',
        measurement_name='NWChem')
    # set obligatory parameters and statistics
    # set common parameters and statistics
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('App:Version')
    parser.add_must_have_parameter('App:Branch')
    parser.add_must_have_parameter('Input:File')

    parser.add_must_have_statistic('Wall Clock Time')
    parser.add_must_have_statistic('User Time')
    parser.add_must_have_statistic("Global Arrays 'Create' Calls")
    parser.add_must_have_statistic("Global Arrays 'Destroy' Calls")
    parser.add_must_have_statistic("Global Arrays 'Get' Calls")
    parser.add_must_have_statistic("Global Arrays 'Put' Calls")
    parser.add_must_have_statistic("Global Arrays 'Accumulate' Calls")
    parser.add_must_have_statistic("Global Arrays 'Get' Amount")
    parser.add_must_have_statistic("Global Arrays 'Put' Amount")
    parser.add_must_have_statistic("Global Arrays 'Accumulate' Amount")
    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo,
                                         resource_appker_vars)

    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # process the output
    j = 0
    while j < len(lines):

        m = re.search(
            r'Northwest Computational Chemistry Package \(NWChem\) (.+)',
            lines[j])
        if m:
            parser.set_parameter("App:Version", m.group(1).strip())

        m = re.search(r'nwchem branch *=(.+)', lines[j])
        if m:
            parser.set_parameter("App:Branch", m.group(1).strip())

        m = re.search(r'input\s+= (.+)', lines[j])
        if m:
            parser.set_parameter("Input:File", m.group(1).strip())

        m = re.search(r'Total times\s+cpu:\s+([0-9.]+)s\s+wall:\s+([0-9.]+)s',
                      lines[j])
        if m:
            parser.set_statistic("Wall Clock Time",
                                 m.group(2).strip(), "Second")
            parser.set_statistic("User Time", m.group(1).strip(), "Second")

        #                          GA Statistics for process    0
        #                          ------------------------------
        #
        #        create   destroy   get      put      acc     scatter   gather  read&inc
        # calls:  521      521     6.28e+05 6.45e+04 6.78e+05    0        0        0
        # number of processes/call 1.05e+00 1.36e+00 1.03e+00 0.00e+00 0.00e+00
        # bytes total:             7.33e+09 4.35e+08 1.53e+09 0.00e+00 0.00e+00 0.00e+00
        # bytes remote:            5.74e+09 1.31e+08 1.09e+09 0.00e+00 0.00e+00 0.00e+00
        # Max memory consumed for GA by this process: 47428032 bytes
        if re.search(r'GA Statistics for process', lines[j]):
            if re.match(r'^calls', lines[j + 4]):
                v = lines[j + 4].strip().split()
                parser.set_statistic("Global Arrays 'Create' Calls",
                                     "%.0f" % float(v[1]), "Number of Calls")
                parser.set_statistic("Global Arrays 'Destroy' Calls",
                                     "%.0f" % float(v[2]), "Number of Calls")
                parser.set_statistic("Global Arrays 'Get' Calls",
                                     "%.0f" % float(v[3]), "Number of Calls")
                parser.set_statistic("Global Arrays 'Put' Calls",
                                     "%.0f" % float(v[4]), "Number of Calls")
                parser.set_statistic("Global Arrays 'Accumulate' Calls",
                                     "%.0f" % float(v[5]), "Number of Calls")

                v = lines[j + 6].strip().split()
                parser.set_statistic("Global Arrays 'Get' Amount",
                                     (float(v[2])) / 1048576.0, "MByte")
                parser.set_statistic("Global Arrays 'Put' Amount",
                                     (float(v[3])) / 1048576.0, "MByte")
                parser.set_statistic("Global Arrays 'Accumulate' Amount",
                                     (float(v[4])) / 1048576.0, "MByte")

        # NWChem can be optionally compiled with PAPI, and it will
        # report some GLOPS at the end
        # thus here it is optional
        m = re.search(r'Aggregate GFLOPS \(Real_time\):\s+([0-9.]+)', lines[j])
        if m:
            parser.set_statistic(
                "Floating-Point Performance (Wall Clock Time)",
                1000.0 * float(m.group(1).strip()), "MFLOP per Second")

        m = re.search(r'Aggregate GFLOPS \(Proc_time\):\s+([0-9.]+)', lines[j])
        if m:
            parser.set_statistic("Floating-Point Performance (User Time)",
                                 1000.0 * float(m.group(1).strip()),
                                 "MFLOP per Second")
        j += 1

    if __name__ == "__main__":
        # output for testing purpose
        print("parsing complete:", parser.parsing_complete())
        parser.print_params_stats_as_must_have()
        print(parser.get_xml())

    # return complete XML overwize return None
    return parser.get_xml()
Beispiel #5
0
def process_appker_output(appstdout=None,
                          stdout=None,
                          stderr=None,
                          geninfo=None,
                          resource_appker_vars=None):
    # set App Kernel Description
    parser = AppKerOutputParser(
        name='mpi-tile-io',
        version=1,
        description="MPI-Tile-IO Benchmark",
        url='http://www.mcs.anl.gov/research/projects/pio-benchmark',
        measurement_name='MPI-Tile-IO')
    # set obligatory parameters and statistics
    # set common parameters and statistics
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('2D Collective Read Test File System')
    parser.add_must_have_parameter('2D Collective Write Test File System')
    parser.add_must_have_parameter('2D HDF5 Collective Read Test File System')
    parser.add_must_have_parameter('2D HDF5 Collective Write Test File System')
    parser.add_must_have_parameter('2D Independent Read Test File System')
    parser.add_must_have_parameter('2D Independent Write Test File System')
    parser.add_must_have_parameter('2D Per-Process Data Topology')
    parser.add_must_have_parameter('2D Per-Process Ghost Zone')
    parser.add_must_have_parameter('2D Per-Process Memory')
    parser.add_must_have_parameter('2D Process Topology')
    parser.add_must_have_parameter('3D Collective Read Test File System')
    parser.add_must_have_parameter('3D Collective Write Test File System')
    parser.add_must_have_parameter('3D HDF5 Collective Read Test File System')
    parser.add_must_have_parameter('3D HDF5 Collective Write Test File System')
    parser.add_must_have_parameter('3D Independent Read Test File System')
    parser.add_must_have_parameter('3D Independent Write Test File System')
    parser.add_must_have_parameter('3D Per-Process Data Topology')
    parser.add_must_have_parameter('3D Per-Process Ghost Zone')
    parser.add_must_have_parameter('3D Per-Process Memory')
    parser.add_must_have_parameter('3D Process Topology')
    parser.add_must_have_parameter('App:ExeBinSignature')
    parser.add_must_have_parameter('HDF Version')
    # parser.add_must_have_parameter('MPI-IO Hints')
    parser.add_must_have_parameter('RunEnv:Nodes')

    parser.add_must_have_statistic(
        '2D Array Collective Read Aggregate Throughput')
    parser.add_must_have_statistic(
        '2D Array Collective Write Aggregate Throughput')
    parser.add_must_have_statistic(
        '2D Array HDF5 Collective Read Aggregate Throughput')
    parser.add_must_have_statistic(
        '2D Array HDF5 Collective Write Aggregate Throughput')
    parser.add_must_have_statistic(
        '2D Array Independent Read Aggregate Throughput')
    parser.add_must_have_statistic(
        '2D Array Independent Write Aggregate Throughput')
    parser.add_must_have_statistic(
        '3D Array Collective Read Aggregate Throughput')
    parser.add_must_have_statistic(
        '3D Array Collective Write Aggregate Throughput')
    parser.add_must_have_statistic(
        '3D Array HDF5 Collective Read Aggregate Throughput')
    parser.add_must_have_statistic(
        '3D Array HDF5 Collective Write Aggregate Throughput')
    parser.add_must_have_statistic(
        '3D Array Independent Read Aggregate Throughput')
    parser.add_must_have_statistic(
        '3D Array Independent Write Aggregate Throughput')
    parser.add_must_have_statistic('File Close Time (2D Data Collective Read)')
    parser.add_must_have_statistic(
        'File Close Time (2D Data Collective Write)')
    parser.add_must_have_statistic(
        'File Close Time (2D Data HDF5 Collective Read)')
    parser.add_must_have_statistic(
        'File Close Time (2D Data HDF5 Collective Write)')
    parser.add_must_have_statistic(
        'File Close Time (2D Data Independent Read)')
    parser.add_must_have_statistic(
        'File Close Time (2D Data Independent Write)')
    parser.add_must_have_statistic('File Close Time (3D Data Collective Read)')
    parser.add_must_have_statistic(
        'File Close Time (3D Data Collective Write)')
    parser.add_must_have_statistic(
        'File Close Time (3D Data HDF5 Collective Read)')
    parser.add_must_have_statistic(
        'File Close Time (3D Data HDF5 Collective Write)')
    parser.add_must_have_statistic(
        'File Close Time (3D Data Independent Read)')
    parser.add_must_have_statistic(
        'File Close Time (3D Data Independent Write)')
    parser.add_must_have_statistic('File Open Time (2D Data Collective Read)')
    parser.add_must_have_statistic('File Open Time (2D Data Collective Write)')
    parser.add_must_have_statistic(
        'File Open Time (2D Data HDF5 Collective Read)')
    parser.add_must_have_statistic(
        'File Open Time (2D Data HDF5 Collective Write)')
    parser.add_must_have_statistic('File Open Time (2D Data Independent Read)')
    parser.add_must_have_statistic(
        'File Open Time (2D Data Independent Write)')
    parser.add_must_have_statistic('File Open Time (3D Data Collective Read)')
    parser.add_must_have_statistic('File Open Time (3D Data Collective Write)')
    parser.add_must_have_statistic(
        'File Open Time (3D Data HDF5 Collective Read)')
    parser.add_must_have_statistic(
        'File Open Time (3D Data HDF5 Collective Write)')
    parser.add_must_have_statistic('File Open Time (3D Data Independent Read)')
    parser.add_must_have_statistic(
        'File Open Time (3D Data Independent Write)')
    parser.add_must_have_statistic('Wall Clock Time')

    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo,
                                         resource_appker_vars)

    if hasattr(parser, 'appKerWallClockTime'):
        parser.set_statistic("Wall Clock Time",
                             parser.appKerWallClockTime.total_seconds(),
                             "Second")

    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # process the output
    # The parameters mapping table
    # The result mapping table
    pm = {
        "processesTopology": {
            're': r"^# processes topology:(.+)",
            'refun': re.match,
            'val': None
        },
        "localDatasetTopology": {
            're': r"^# local dataset topology:(.+)element",
            'refun': re.match,
            'val': None
        },
        "localMemoryUsage": {
            're': r"^# local dataset memory usage:(.+)byte",
            'refun': re.match,
            'val': None
        },
        "datasetGhostZone": {
            're': r"^# local dataset ghost zone:(.+)",
            'refun': re.match,
            'val': None
        },
        "mpiIOhints": {
            're': r"^# mpiio hints:(.+)",
            'refun': re.match,
            'val': None
        },
        "maxFileOpenTime": {
            're': r"^# Open:.+?max=(\S+)",
            'refun': re.match,
            'val': None
        },
        "maxFileCloseTime": {
            're': r"^# Close:.+?max=(\S+)",
            'refun': re.match,
            'val': None
        },
        "collectiveIO": {
            're': r"^# collective IO:(.+)",
            'refun': re.match,
            'val': None
        },
        "testFileName": {
            're': r"^# filename:(.+)",
            'refun': re.match,
            'val': None
        },
        "fileSystem": {
            're': r"^# filesystem:(.+)",
            'refun': re.match,
            'val': None
        },
        "hdf5Version": {
            're': r"^# HDF5 Version:(.+)",
            'refun': re.match,
            'val': None
        },
    }

    parser.successfulRun = False
    j = -1
    while j < len(lines) - 1:
        for k, v in pm.items():
            m = v['refun'](v['re'], lines[j])
            if m:
                v['val'] = m.group(1).strip()

        m = re.match(r'^# (.+?)bandwidth:(.+)bytes', lines[j])
        if m:
            read_or_write = m.group(1).strip()
            io_bandwidth = m.group(2).strip()

            # can output data ?
            if pm['processesTopology']['val'] and pm['collectiveIO']['val']:
                # construct the label
                label = ''
                dim = '2D'
                m = re.search(r'\d+x\d+x\d', pm['processesTopology']['val'])
                if m:
                    dim = '3D'

                if pm['hdf5Version']['val']:
                    label += 'HDF5 '
                    parser.set_parameter("HDF Version",
                                         pm['hdf5Version']['val'])

                m = re.search(r'yes', pm['collectiveIO']['val'], re.I)
                if m:
                    label += 'Collective '
                else:
                    label += 'Independent '

                m0 = re.search(r'read', read_or_write, re.I)
                m1 = re.search(r'write', read_or_write, re.I)
                if m0:
                    label += 'Read'
                elif m1:
                    label += 'Write'
                else:
                    label += read_or_write[0].upper() + read_or_write[1:]

                parser.set_statistic(
                    "%s Array %s Aggregate Throughput" % (dim, label),
                    "%.2f" % (float(io_bandwidth) / 1024.0 / 1024.0),
                    "MByte per Second")
                if pm["maxFileOpenTime"]['val']:
                    parser.set_statistic(
                        "File Open Time (%s Data %s)" % (dim, label),
                        pm["maxFileOpenTime"]['val'], "Second")
                if pm["maxFileCloseTime"]['val']:
                    parser.set_statistic(
                        "File Close Time (%s Data %s)" % (dim, label),
                        pm["maxFileCloseTime"]['val'], "Second")

                parser.set_parameter("%s Process Topology" % (dim, ),
                                     pm["processesTopology"]['val'])
                if pm["localMemoryUsage"]['val']:
                    parser.set_parameter(
                        "%s Per-Process Memory" % (dim, ),
                        float(pm["localMemoryUsage"]['val']) / 1024.0 / 1024.0,
                        "MByte")
                if pm["localDatasetTopology"]['val']:
                    parser.set_parameter(
                        "%s Per-Process Data Topology" % (dim, ),
                        pm["localDatasetTopology"]['val'], "Element")
                if pm["datasetGhostZone"]['val']:
                    parser.set_parameter("%s Per-Process Ghost Zone" % (dim, ),
                                         pm["datasetGhostZone"]['val'])
                if pm["mpiIOhints"]['val']:
                    parser.set_parameter("MPI-IO Hints",
                                         pm["mpiIOhints"]['val'])
                # $benchmark->set_parameter( "${dim} ${label} Test File", $testFileName ) if( defined($testFileName) )
                if pm["fileSystem"]['val']:
                    parser.set_parameter(
                        "%s %s Test File System" % (dim, label),
                        pm["fileSystem"]['val'])
                parser.successfulRun = True

                pm["processesTopology"]['val'] = None
                pm["localDatasetTopology"]['val'] = None
                pm["localMemoryUsage"]['val'] = None
                pm["datasetGhostZone"]['val'] = None
                pm["mpiIOhints"]['val'] = None
                # pm["readOrWrite"]['val']=None
                pm["collectiveIO"]['val'] = None
                # pm["IObandwidth"]['val']=None
                pm["maxFileOpenTime"]['val'] = None
                pm["maxFileCloseTime"]['val'] = None
                pm["testFileName"]['val'] = None
                pm["fileSystem"]['val'] = None
                pm["hdf5Version"]['val'] = None
        j += 1

    if __name__ == "__main__":
        # output for testing purpose
        print("parsing complete:", parser.parsing_complete(verbose=True))
        parser.print_params_stats_as_must_have()
        print(parser.get_xml())
    # Print out missing parameters for debug purpose
    parser.parsing_complete(verbose=True)
    # return complete XML overwize return None
    return parser.get_xml()
Beispiel #6
0
def process_appker_output(appstdout=None,
                          stdout=None,
                          stderr=None,
                          geninfo=None,
                          resource_appker_vars=None):
    # set App Kernel Description
    parser = AppKerOutputParser(name='hpcc',
                                version=1,
                                description="HPC Challenge Benchmarks",
                                url='http://icl.cs.utk.edu/hpcc/',
                                measurement_name='xdmod.benchmark.hpcc')
    # set obligatory parameters and statistics
    # set common parameters and statistics
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('App:Version')
    parser.add_must_have_parameter('Input:DGEMM Problem Size')
    parser.add_must_have_parameter('Input:High Performance LINPACK Grid Cols')
    parser.add_must_have_parameter('Input:High Performance LINPACK Grid Rows')
    parser.add_must_have_parameter(
        'Input:High Performance LINPACK Problem Size')
    parser.add_must_have_parameter('Input:MPI Ranks')
    parser.add_must_have_parameter('Input:MPIRandom Problem Size')
    parser.add_must_have_parameter('Input:OpenMP Threads')
    parser.add_must_have_parameter('Input:PTRANS Problem Size')
    parser.add_must_have_parameter('Input:STREAM Array Size')
    parser.add_must_have_parameter('RunEnv:CPU Speed')
    parser.add_must_have_parameter('RunEnv:Nodes')

    parser.add_must_have_statistic(
        'Average Double-Precision General Matrix Multiplication (DGEMM) Floating-Point Performance'
    )
    parser.add_must_have_statistic("Average STREAM 'Add' Memory Bandwidth")
    parser.add_must_have_statistic("Average STREAM 'Copy' Memory Bandwidth")
    parser.add_must_have_statistic("Average STREAM 'Scale' Memory Bandwidth")
    parser.add_must_have_statistic("Average STREAM 'Triad' Memory Bandwidth")
    parser.add_must_have_statistic(
        'Fast Fourier Transform (FFTW) Floating-Point Performance')
    parser.add_must_have_statistic('High Performance LINPACK Efficiency')
    parser.add_must_have_statistic(
        'High Performance LINPACK Floating-Point Performance')
    parser.add_must_have_statistic('High Performance LINPACK Run Time')
    parser.add_must_have_statistic('MPI Random Access')
    parser.add_must_have_statistic('Parallel Matrix Transpose (PTRANS)')
    parser.add_must_have_statistic('Wall Clock Time')
    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo,
                                         resource_appker_vars)

    if parser.appKerWallClockTime is not None:
        parser.set_statistic("Wall Clock Time",
                             total_seconds(parser.appKerWallClockTime),
                             "Second")

    # Intel MPI benchmark suite contains three classes of benchmarks:
    #
    #  Single-transfer, which needs only 2 processes
    #  Parallel-transfer, which can use as many processes that are available
    #  Collective, which can use as many processes that are available

    # The parameters mapping table
    params = {
        "CommWorldProcs": ["MPI Ranks", "", ""],
        "HPL_N": ["High Performance LINPACK Problem Size", "", ""],
        "HPL_nprow": ["High Performance LINPACK Grid Rows", "", ""],
        "HPL_npcol": ["High Performance LINPACK Grid Cols", "", ""],
        "PTRANS_n": ["PTRANS Problem Size", "", ""],
        "MPIRandomAccess_N":
        ["MPIRandom Problem Size", "MWord", "val/1024/1024"],
        "STREAM_VectorSize": ["STREAM Array Size", "MWord", ""],
        "DGEMM_N": ["DGEMM Problem Size", "", ""],
        "omp_get_num_threads": ["OpenMP Threads", "", ""],
    }

    # The result mapping table
    metrics = {
        "HPL_Tflops": [
            "High Performance LINPACK Floating-Point Performance",
            "MFLOP per Second", "val*1e6"
        ],
        "HPL_time": ["High Performance LINPACK Run Time", "Second", ""],
        "PTRANS_GBs":
        ["Parallel Matrix Transpose (PTRANS)", "MByte per Second", "val*1024"],
        "MPIRandomAccess_GUPs":
        ["MPI Random Access", "MUpdate per Second", "val*1000"],
        "MPIFFT_Gflops": [
            "Fast Fourier Transform (FFTW) Floating-Point Performance",
            "MFLOP per Second", "val*1000"
        ],
        "StarDGEMM_Gflops": [
            "Average Double-Precision General Matrix Multiplication (DGEMM) Floating-Point Performance",
            "MFLOP per Second", "val*1000"
        ],
        "StarSTREAM_Copy": [
            "Average STREAM 'Copy' Memory Bandwidth", "MByte per Second",
            "val*1024"
        ],
        "StarSTREAM_Scale": [
            "Average STREAM 'Scale' Memory Bandwidth", "MByte per Second",
            "val*1024"
        ],
        "StarSTREAM_Add": [
            "Average STREAM 'Add' Memory Bandwidth", "MByte per Second",
            "val*1024"
        ],
        "StarSTREAM_Triad": [
            "Average STREAM 'Triad' Memory Bandwidth", "MByte per Second",
            "val*1024"
        ]
    }

    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # process the output
    parser.successfulRun = False
    result_begin = None
    hpl_tflops = None
    num_cores = None

    values = {}
    j = -1
    while j < len(lines) - 1:
        j += 1
        m = re.search(r'End of HPC Challenge tests', lines[j])
        if m:
            parser.successfulRun = True

        m = re.match(r'^Begin of Summary section', lines[j])
        if m:
            result_begin = 1
            continue

        m = re.match(r'^(\w+)=([\w.]+)', lines[j])
        if m and result_begin:
            metric_name = m.group(1).strip()
            values[metric_name] = m.group(2).strip()
            if metric_name == "HPL_Tflops":
                hpl_tflops = float(values[metric_name])
            if metric_name == "CommWorldProcs":
                num_cores = int(values[metric_name])
        m = re.match(r'^Running on ([0-9.]+) processors', lines[j])
        if m:
            num_cores = int(m.group(1).strip())

    if hpl_tflops is None or num_cores is None:
        parser.successfulRun = False

    hpcc_version = None
    mhz = None
    theoretical_gflops = None

    if "VersionMajor" in values and "VersionMinor" in values and "VersionMicro" in values:
        hpcc_version = values["VersionMajor"] + "." + values[
            "VersionMinor"] + "." + values["VersionMicro"]
    if "VersionRelease" in values:
        hpcc_version += values["VersionRelease"]
    if hpcc_version:
        parser.set_parameter("App:Version", hpcc_version)

    for k, v in params.items():
        if k not in values:
            continue
        val = values[k]
        if v[2].find('val') >= 0:
            # if convertion formula is used, then first set val variable and then eval the formula
            val = get_float_or_int(values[k])
            val = eval(v[2])
        units = v[1] if [1] != "" else None
        parser.set_parameter("Input:" + v[0], val, units)

    for k, v in metrics.items():
        if k not in values:
            continue
        val = values[k]
        if v[2].find('val') >= 0:
            # if convertion formula is used, then first set val variable and then eval the formula
            val = get_float_or_int(values[k])
            val = eval(v[2])
        units = v[1] if [1] != "" else None
        parser.set_statistic(v[0], val, units)

    if "cpu_speed" in parser.geninfo:
        ll = parser.geninfo["cpu_speed"].splitlines()
        cpu_speed_max = 0.0
        for l in ll:
            m = re.search(r'([\d.]+)$', l)
            if m:
                v = float(m.group(1).strip())
                if v > cpu_speed_max:
                    cpu_speed_max = v
        if cpu_speed_max > 0.0:
            parser.set_parameter("RunEnv:CPU Speed", cpu_speed_max, "MHz")
            mhz = cpu_speed_max

    if resource_appker_vars is not None:
        if 'resource' in resource_appker_vars and 'app' in resource_appker_vars:
            if 'theoreticalGFlopsPerCore' in resource_appker_vars['app']:
                resname = resource_appker_vars['resource']['name']
                if resname in resource_appker_vars['app'][
                        'theoreticalGFlopsPerCore']:
                    theoretical_gflops = resource_appker_vars['app'][
                        'theoreticalGFlopsPerCore'][resname] * num_cores
                    print("theoreticalGFlops", resname, theoretical_gflops)

    if theoretical_gflops is None and mhz is not None:
        # Most modern x86 & POWER processors are superscale and can issue 4 instructions per cycle
        theoretical_gflops = mhz * num_cores * 4 / 1000.0
    if theoretical_gflops and hpl_tflops:
        # Convert both to GFlops and derive the Efficiency
        percent = (1000.0 * hpl_tflops / theoretical_gflops) * 100.0
        parser.set_statistic("High Performance LINPACK Efficiency",
                             "%.3f" % percent, "Percent")

    if __name__ == "__main__":
        # output for testing purpose
        print("parsing complete:", parser.parsing_complete(verbose=True))
        parser.print_params_stats_as_must_have()
        print(parser.get_xml())

    # return complete XML overwize return None
    return parser.get_xml()
Beispiel #7
0
def process_appker_output(appstdout=None,
                          stdout=None,
                          stderr=None,
                          geninfo=None,
                          proclog=None,
                          resource_appker_vars=None):
    # set App Kernel Description
    parser = AppKerOutputParser(
        name='namd',
        version=1,
        description="NAMD: Scalable Molecular Dynamics Package",
        url='http://www.ks.uiuc.edu/Research/namd/',
        measurement_name='NAMD')
    # set obligatory parameters and statistics
    # set common parameters and statistics
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('App:Version')
    parser.add_must_have_parameter('Input:Coordinate File')
    parser.add_must_have_parameter('Input:Number of Angles')
    parser.add_must_have_parameter('Input:Number of Atoms')
    parser.add_must_have_parameter('Input:Number of Bonds')
    parser.add_must_have_parameter('Input:Number of Dihedrals')
    parser.add_must_have_parameter('Input:Number of Steps')
    parser.add_must_have_parameter('Input:Structure File')
    parser.add_must_have_parameter('Input:Timestep')

    parser.add_must_have_statistic('Memory')
    parser.add_must_have_statistic('Molecular Dynamics Simulation Performance')
    parser.add_must_have_statistic('Wall Clock Time')

    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo,
                                         resource_appker_vars)

    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # process the output
    successful_run = False
    j = 0
    while j < len(lines):

        m = re.match(r'^Info: NAMD ([0-9a-zA-Z.]+)', lines[j])
        if m:
            parser.set_parameter("App:Version", m.group(1))

        m = re.match(r'^Info: TIMESTEP\s+([0-9.]+)', lines[j])
        if m:
            parser.set_parameter("Input:Timestep",
                                 m.group(1) + "e-15", "Second per Step")

        m = re.match(r'^Info: NUMBER OF STEPS\s+([0-9.]+)', lines[j])
        if m:
            parser.set_parameter("Input:Number of Steps", m.group(1))

        m = re.match(r'^Info: COORDINATE PDB\s+(.+)', lines[j])
        if m:
            parser.set_parameter("Input:Coordinate File", m.group(1))

        m = re.match(r'^Info: STRUCTURE FILE\s+(.+)', lines[j])
        if m:
            parser.set_parameter("Input:Structure File", m.group(1))

        m = re.match(
            r'^Info: Running on ([0-9.]+) processors, ([0-9.]+) nodes, ([0-9.]+) physical nodes.',
            lines[j])
        if m:
            parser.set_parameter("App:NCores", m.group(1).strip())
            parser.set_parameter("App:NNodes", m.group(3).strip())

        if re.match(r'^Info: STRUCTURE SUMMARY', lines[j]):
            j += 1
            for k in range(25):
                if re.match(r'^Info: \*\*\*\*\*', lines[j]):
                    break

                m = re.match(r'^Info:\s+([0-9]+)\s+ATOMS\n', lines[j])
                if m:
                    parser.set_parameter("Input:Number of Atoms", m.group(1))

                m = re.match(r'^Info:\s+([0-9]+)\s+BONDS\n', lines[j])
                if m:
                    parser.set_parameter("Input:Number of Bonds", m.group(1))

                m = re.match(r'^Info:\s+([0-9]+)\s+ANGLES\n', lines[j])
                if m:
                    parser.set_parameter("Input:Number of Angles", m.group(1))

                m = re.match(r'^Info:\s+([0-9]+)\s+DIHEDRALS\n', lines[j])
                if m:
                    parser.set_parameter("Input:Number of Dihedrals",
                                         m.group(1))

                j += 1

        if re.search(r'Info: Benchmark time:', lines[j]):
            m = re.search(r' ([0-9.]+) days/ns', lines[j])
            if m:
                parser.set_statistic(
                    "Molecular Dynamics Simulation Performance",
                    str(1.0e-9 / float(m.group(1))), "Second per Day")

        m = re.match(
            r'^WallClock:\s+([0-9.]+)\s+CPUTime:\s+([0-9.]+)\s+Memory:\s+([0-9.]+)',
            lines[j])
        if m:
            parser.set_statistic("Wall Clock Time", m.group(1), "Second")
            parser.set_statistic("Memory", m.group(3), "MByte")
            successful_run = True

        m = re.match(r'^End of program', lines[j])
        if m:
            successful_run = True

        j += 1

    parser.successfulRun = successful_run

    if __name__ == "__main__":
        # output for testing purpose
        print("parsing complete:", parser.parsing_complete())
        parser.print_params_stats_as_must_have()
        print(parser.get_xml())

    # return complete XML overwize return None
    return parser.get_xml()
Beispiel #8
0
def process_appker_output(appstdout=None,
                          stdout=None,
                          stderr=None,
                          geninfo=None,
                          proclog=None,
                          resource_appker_vars=None):
    # set App Kernel Description
    parser = AppKerOutputParser(name='imb',
                                version=1,
                                description="Intel MPI Benchmarks",
                                url='http://www.intel.com/software/imb',
                                measurement_name='Intel MPI Benchmarks')
    # set obligatory parameters and statistics
    # set common parameters and statistics
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('App:MPI Thread Environment')
    parser.add_must_have_parameter('App:MPI Version')
    parser.add_must_have_parameter('App:Max Message Size')

    parser.add_must_have_statistic('Max Exchange Bandwidth')
    parser.add_must_have_statistic(
        "Max MPI-2 Bidirectional 'Get' Bandwidth (aggregate)")
    parser.add_must_have_statistic(
        "Max MPI-2 Bidirectional 'Get' Bandwidth (non-aggregate)")
    parser.add_must_have_statistic(
        "Max MPI-2 Bidirectional 'Put' Bandwidth (aggregate)")
    parser.add_must_have_statistic(
        "Max MPI-2 Bidirectional 'Put' Bandwidth (non-aggregate)")
    parser.add_must_have_statistic(
        "Max MPI-2 Unidirectional 'Get' Bandwidth (aggregate)")
    parser.add_must_have_statistic(
        "Max MPI-2 Unidirectional 'Get' Bandwidth (non-aggregate)")
    parser.add_must_have_statistic(
        "Max MPI-2 Unidirectional 'Put' Bandwidth (aggregate)")
    parser.add_must_have_statistic(
        "Max MPI-2 Unidirectional 'Put' Bandwidth (non-aggregate)")
    parser.add_must_have_statistic('Max PingPing Bandwidth')
    parser.add_must_have_statistic('Max PingPong Bandwidth')
    parser.add_must_have_statistic('Max SendRecv Bandwidth')
    parser.add_must_have_statistic('Min AllGather Latency')
    parser.add_must_have_statistic('Min AllGatherV Latency')
    parser.add_must_have_statistic('Min AllReduce Latency')
    parser.add_must_have_statistic('Min AllToAll Latency')
    parser.add_must_have_statistic('Min AllToAllV Latency')
    parser.add_must_have_statistic('Min Barrier Latency')
    parser.add_must_have_statistic('Min Broadcast Latency')
    parser.add_must_have_statistic('Min Gather Latency')
    parser.add_must_have_statistic('Min GatherV Latency')
    # parser.add_must_have_statistic("Min MPI-2 'Accumulate' Latency (aggregate)")
    # parser.add_must_have_statistic("Min MPI-2 'Accumulate' Latency (non-aggregate)")
    parser.add_must_have_statistic('Min MPI-2 Window Creation Latency')
    parser.add_must_have_statistic('Min Reduce Latency')
    parser.add_must_have_statistic('Min ReduceScatter Latency')
    parser.add_must_have_statistic('Min Scatter Latency')
    parser.add_must_have_statistic('Min ScatterV Latency')
    parser.add_must_have_statistic('Wall Clock Time')

    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo,
                                         resource_appker_vars)

    if hasattr(parser, 'appKerWallClockTime'):
        parser.set_statistic("Wall Clock Time",
                             total_seconds(parser.appKerWallClockTime),
                             "Second")

    # Intel MPI benchmark suite contains three classes of benchmarks:
    #
    #  Single-transfer, which needs only 2 processes
    #  Parallel-transfer, which can use as many processes that are available
    #  Collective, which can use as many processes that are available

    # The parameters mapping table
    params = {
        "MPI Thread Environment": ["MPI Thread Environment", "", ""],
        "MPI Version": ["MPI Version", "", ""],
        "Maximum message length in bytes":
        ["Max Message Size", "MByte", "<val>/1024/1024"]
    }

    # The result mapping table
    metrics = {
        "PingPing": ["PingPing Bandwidth", "MByte per Second", "max"],
        "PingPong": ["PingPong Bandwidth", "MByte per Second", "max"],
        "Multi-PingPing": ["PingPing Bandwidth", "MByte per Second", "max"],
        "Multi-PingPong": ["PingPong Bandwidth", "MByte per Second", "max"],
        "Sendrecv": ["SendRecv Bandwidth", "MByte per Second", "max"],
        "Exchange": ["Exchange Bandwidth", "MByte per Second", "max"],
        "Allreduce": ["AllReduce Latency", "us", "min"],
        "Reduce": ["Reduce Latency", "us", "min"],
        "Reduce_scatter": ["ReduceScatter Latency", "us", "min"],
        "Allgather": ["AllGather Latency", "us", "min"],
        "Allgatherv": ["AllGatherV Latency", "us", "min"],
        "Gather": ["Gather Latency", "us", "min"],
        "Gatherv": ["GatherV Latency", "us", "min"],
        "Scatter": ["Scatter Latency", "us", "min"],
        "Scatterv": ["ScatterV Latency", "us", "min"],
        "Alltoall": ["AllToAll Latency", "us", "min"],
        "Alltoallv": ["AllToAllV Latency", "us", "min"],
        "Bcast": ["Broadcast Latency", "us", "min"],
        "Barrier": ["Barrier Latency", "us", "min"],
        "Window": ["MPI-2 Window Creation Latency", "us", "min"],
        "Multi-Unidir_Get":
        ["MPI-2 Unidirectional 'Get' Bandwidth", "MByte per Second", "max"],
        "Multi-Unidir_Put":
        ["MPI-2 Unidirectional 'Put' Bandwidth", "MByte per Second", "max"],
        "Multi-Bidir_Get":
        ["MPI-2 Bidirectional 'Get' Bandwidth", "MByte per Second", "max"],
        "Multi-Bidir_Put":
        ["MPI-2 Bidirectional 'Put' Bandwidth", "MByte per Second", "max"],
        "Unidir_Get":
        ["MPI-2 Unidirectional 'Get' Bandwidth", "MByte per Second", "max"],
        "Unidir_Put":
        ["MPI-2 Unidirectional 'Put' Bandwidth", "MByte per Second", "max"],
        "Bidir_Get":
        ["MPI-2 Bidirectional 'Get' Bandwidth", "MByte per Second", "max"],
        "Bidir_Put":
        ["MPI-2 Bidirectional 'Put' Bandwidth", "MByte per Second", "max"],
        "Accumulate": ["MPI-2 'Accumulate' Latency", "us", "min"]
    }

    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # process the output
    parser.successfulRun = False
    aggregate_mode = None
    metric = None
    j = -1
    while j < len(lines) - 1:
        j += 1
        m = re.search(r'All processes entering MPI_Finalize', lines[j])
        if m:
            parser.successfulRun = True

        m = re.match(r'^# Benchmarking\s+(\S+)', lines[j])
        if m:
            if m.group(1) in metrics:
                metric = m.group(1)
                continue

        m = re.match(r'^#\s+MODE:\s+(\S+)', lines[j])
        if m and metric and aggregate_mode is None:
            aggregate_mode = m.group(1)
            continue

        m = re.match(r'^# (.+): (.+)', lines[j])
        if m:  # benchmark parameters
            param = m.group(1).strip()
            if param in params:
                val = m.group(2).strip()
                v = params[param][2]
                if v.find('<val>') >= 0:
                    val = get_float_or_int(val)
                    val = eval(v.replace('<val>', 'val'))
                parser.set_parameter("App:" + params[param][0],
                                     str(val) + " ", params[param][1])
            continue

        m = re.match(r'^\s+([1-9]\d*)\s+\d+', lines[j])
        if m and metric:  # this effectively skips the first line of result, which has #bytes = 0
            results = []

            while m:
                numbers = lines[j].split()
                results.append(
                    float(numbers[-1]
                          ))  # tokenize the line, and extract the last column

                j += 1
                if j < len(lines):
                    m = re.match(r'^\s+([1-9]\d*)\s+\d+', lines[j])
                    if lines[j].count('IMB_init_buffers_iter') > 0:
                        break
                else:
                    break
            metric_name = metrics[metric][0]
            if aggregate_mode:
                metric_name += " (" + aggregate_mode.lower() + ")"
            if len(results) > 0:
                if metrics[metric][1] == 'us':
                    statname = metrics[metric][2][0].upper(
                    ) + metrics[metric][2][1:] + " " + metric_name
                    statval = eval(metrics[metric][2] + "(results)")
                    parser.set_statistic(statname, statval * 1e-6, "Second")
                else:
                    statname = metrics[metric][2][0].upper(
                    ) + metrics[metric][2][1:] + " " + metric_name
                    statval = eval(metrics[metric][2] + "(results)")
                    parser.set_statistic(statname, statval, metrics[metric][1])

            aggregate_mode = None
            metric = None
    if parser.get_parameter("App:MPI Thread Environment") is None:
        parser.set_parameter("App:MPI Thread Environment", "")

    if __name__ == "__main__":
        # output for testing purpose
        print("parsing complete:", parser.parsing_complete(verbose=True))
        parser.print_params_stats_as_must_have()
        print(parser.get_xml())
    # Print out missing parameters for debug purpose
    parser.parsing_complete(verbose=True)
    # return complete XML overwize return None
    return parser.get_xml()
Beispiel #9
0
def process_appker_output(appstdout=None,
                          stdout=None,
                          stderr=None,
                          geninfo=None,
                          resource_appker_vars=None):
    # set App Kernel Description
    parser = AppKerOutputParser(
        name='wrf',
        version=1,
        description="Weather Research and Forecasting Model",
        url='http://www.wrf-model.org',
        measurement_name='WRF')
    # set obligatory parameters and statistics
    # set common parameters and statistics
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('App:Version')
    parser.add_must_have_parameter('Input:Grid Resolution')
    parser.add_must_have_parameter('Input:Simulation Length')
    parser.add_must_have_parameter('Input:Simulation Start Date')
    parser.add_must_have_parameter('Input:Timestep')
    parser.add_must_have_parameter('RunEnv:Nodes')
    parser.add_must_have_parameter('WRF Dynamical Solver')

    # parser.add_must_have_statistic('Average Floating-Point Performance')
    parser.add_must_have_statistic('Average Simulation Speed')
    parser.add_must_have_statistic('Mean Time To Simulate One Timestep')
    parser.add_must_have_statistic('Output Data Size')
    # parser.add_must_have_statistic('Peak Floating-Point Performance')
    parser.add_must_have_statistic('Peak Simulation Speed')
    parser.add_must_have_statistic('Time Spent on I/O')
    parser.add_must_have_statistic('Wall Clock Time')

    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo,
                                         resource_appker_vars)

    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # process the output
    io_size = None
    wall_clock_time = None
    iteration_wall_clock_time = []
    sim_time_per_iteration = None
    dx = None
    dy = None
    flops_conversion = None

    j = 0
    while j < len(lines):
        m = re.search(r'XDMOD\*\*\*SIZE OF CURRENT DIR BEFORE WRF RUN\s*(\d+)',
                      lines[j])
        if m:
            io_size = int(m.group(1).strip())

        m = re.search(r'XDMOD\*\*\*SIZE OF CURRENT DIR AFTER WRF RUN\s*(\d+)',
                      lines[j])
        if m and io_size:
            parser.set_statistic("Output Data Size",
                                 (int(m.group(1).strip()) - io_size) / 1024.0 /
                                 1024.0, "MByte")

        m = re.search(r'XDMOD\*\*\*WRF RUN BEGINS HERE --(.+)', lines[j])
        if m:
            wall_clock_time = parser.get_datetime_local(m.group(1).strip())

        m = re.search(r'XDMOD\*\*\*WRF RUN HAS FINISHED --(.+)', lines[j])
        if m and wall_clock_time:
            wall_clock_time = parser.get_datetime_local(
                m.group(1).strip()) - wall_clock_time
            parser.set_statistic("Wall Clock Time",
                                 wall_clock_time.total_seconds(), "Second")

        if lines[j].find('XDMOD***RESULT OF rsl.out.0000 BEGINS') >= 0:
            # the output from MPI rank #0
            io_time = None
            while j < len(lines):
                if lines[j].find('XDMOD***RESULT OF rsl.out.0000 ENDS') >= 0:
                    break

                m = re.search(
                    r'Timing for processing restart file.+?:\s+(\d\S+)',
                    lines[j], re.I)
                if m:
                    if io_time is None:
                        io_time = 0.0
                    io_time += float(m.group(1).strip())

                m = re.search(r'Timing for Writing.+?:\s+(\d\S+)', lines[j],
                              re.I)
                if m:
                    if io_time is None:
                        io_time = 0.0
                    io_time += float(m.group(1).strip())

                m = re.search(
                    r'Timing for main: time.+?on domain.+?:\s+(\d\S+)',
                    lines[j], re.I)
                if m:
                    iteration_wall_clock_time.append(float(m.group(1).strip()))

                m = re.search(r'WRF NUMBER OF TILES.+?(\d+)', lines[j])
                if m:
                    omp_threads = int(m.group(1).strip())
                    if omp_threads > 1:
                        parser.set_parameter("Number of OpenMP Threads",
                                             omp_threads)

                m = re.match(r'^\s+WRF V(\S+) MODEL', lines[j])
                if m:
                    parser.set_parameter("App:Version", m.group(1).strip())
                j += 1
            parser.set_statistic("Time Spent on I/O", io_time, "Second")

        if re.search('XDMOD\*\*\*RESULT OF wrfout.+?BEGINS',
                     lines[j]) is not None:
            # the output file's header (netCDF dump)
            io_time = None
            while j < len(lines):
                if re.search('XDMOD\*\*\*RESULT OF wrfout.+?ENDS',
                             lines[j]) is not None:
                    break

                m = re.search(r':DX = (\d+)', lines[j], re.I)
                if m:
                    dx = float(m.group(1).strip()) * 0.001  # in meters

                m = re.search(r':DY = (\d+)', lines[j], re.I)
                if m:
                    dy = float(m.group(1).strip()) * 0.001  # in meters

                m = re.search(r':DT = (\d+)', lines[j], re.I)
                if m:
                    sim_time_per_iteration = float(
                        m.group(1).strip())  # in seconds
                    parser.set_parameter("Input:Timestep",
                                         sim_time_per_iteration,
                                         "Second per Step")

                m = re.search(r':SIMULATION_START_DATE = "(.+?)"', lines[j],
                              re.I)
                if m:
                    parser.set_parameter("Input:Simulation Start Date",
                                         (m.group(1).strip()))

                m = re.search(r':GRIDTYPE = "(.+?)"', lines[j], re.I)
                if m:
                    solver = m.group(1).strip()
                    if solver == 'C':
                        solver = 'Advanced Research WRF (ARW)'
                    if solver == 'E':
                        solver = 'Nonhydrostatic Mesoscale Model (NMM)'
                    parser.set_parameter("WRF Dynamical Solver", solver)

                m = re.search(r'Timing for Writing.+?:\s+(\d\S+)', lines[j],
                              re.I)
                if m:
                    if io_time is None:
                        io_time = 0.0
                    io_time += float(m.group(1).strip())

                m = re.search(
                    r'Timing for main: time.+?on domain.+?:\s+(\d\S+)',
                    lines[j], re.I)
                if m:
                    iteration_wall_clock_time.append(float(m.group(1).strip()))

                m = re.search(r'WRF NUMBER OF TILES.+?(\d+)', lines[j])
                if m:
                    omp_threads = int(m.group(1).strip())
                    if omp_threads > 1:
                        parser.set_parameter("Number of OpenMP Threads",
                                             omp_threads)

                m = re.match(r'^\s+WRF V(\S+) MODEL', lines[j])
                if m:
                    parser.set_parameter("App:Version", m.group(1).strip())
                j += 1
            if dx and dy:
                if (dx - int(dx)) * 1000 < 0.1 and (
                        dy - int(dy)
                ) * 1000 < 0.1:  # back compatibility with output format
                    parser.set_parameter("Input:Grid Resolution",
                                         "%.0f x %.0f" % (dx, dy), "km^2")
                else:
                    parser.set_parameter("Input:Grid Resolution",
                                         str(dx) + " x " + str(dy), "km^2")

        m = re.search(r'XDMOD\*\*\*FLOATING-POINT PERFORMANCE CONVERSION',
                      lines[j])
        if m:
            flops_conversion = lines[j + 1].strip()
        j += 1

    if wall_clock_time:
        parser.successfulRun = True
    else:
        parser.successfulRun = False

    if len(iteration_wall_clock_time) > 0 and sim_time_per_iteration:
        parser.set_parameter("Input:Simulation Length",
                             (len(iteration_wall_clock_time)) *
                             sim_time_per_iteration / 3600.0, "Hour")
        iteration_wall_clock_time = sorted(iteration_wall_clock_time)
        iteration_wall_clock_time.pop()

        t = 0.0
        min_t = iteration_wall_clock_time[0]
        for tt in iteration_wall_clock_time:
            t += tt
        t = t / len(iteration_wall_clock_time)
        parser.set_statistic("Mean Time To Simulate One Timestep", t, "Second")
        parser.set_statistic("Average Simulation Speed",
                             sim_time_per_iteration / t,
                             "Simulated Second per Second")
        parser.set_statistic("Peak Simulation Speed",
                             sim_time_per_iteration / min_t,
                             "Simulated Second per Second")

        if flops_conversion:
            flops_conversion = flops_conversion.replace("$", "").replace(
                "gflops=", "")
            gflops = eval(flops_conversion, {'T': t})
            parser.set_statistic("Average Floating-Point Performance",
                                 1000.0 * gflops, "MFLOP per Second")
            gflops = eval(flops_conversion, {'T': min_t})
            parser.set_statistic("Peak Floating-Point Performance",
                                 1000.0 * gflops, "MFLOP per Second")

    if __name__ == "__main__":
        # output for testing purpose
        parsing_complete = parser.parsing_complete(True)
        print("parsing complete:", parsing_complete)
        if hasattr(parser, 'successfulRun'):
            print("successfulRun", parser.successfulRun)
        parser.print_params_stats_as_must_have()
        print(parser.get_xml())

    # return complete XML overwize return None
    return parser.get_xml()
Beispiel #10
0
def process_appker_output(appstdout=None,
                          stdout=None,
                          stderr=None,
                          geninfo=None,
                          proclog=None,
                          resource_appker_vars=None):
    # set App Kernel Description
    parser = AppKerOutputParser(name='quantum_espresso',
                                version=1,
                                description="Quantum ESPRESSO (PWSCF)",
                                url='http://www.quantum-espresso.org',
                                measurement_name='Quantum_ESPRESSO')
    # set obligatory parameters and statistics
    # set common parameters and statistics
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('App:Version')
    parser.add_must_have_parameter('Input:Number of Atoms per Cell')
    parser.add_must_have_parameter('Input:Number of Atomic Types')
    parser.add_must_have_parameter('Input:Number of Electrons')

    parser.add_must_have_statistic('Wall Clock Time')
    parser.add_must_have_statistic('User Time')
    parser.add_must_have_statistic("Per-Process Dynamical Memory")
    parser.add_must_have_statistic("Time Spent in Program Initialization")
    parser.add_must_have_statistic("Time Spent in Electron Energy Calculation")
    parser.add_must_have_statistic("Time Spent in Force Calculation")
    # This statistic probably was working for a different set of inputs, optional now
    # parser.add_must_have_statistic("Time Spent in Stress Calculation")
    # This statistic probably was working for a different set of inputs, optional now
    # parser.add_must_have_statistic("Time Spent in Potential Updates "\
    # "(Charge Density and Wavefunctions Extrapolations)")

    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo,
                                         resource_appker_vars)

    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # process the output
    parser.successfulRun = False
    j = 0
    while j < len(lines):

        m = re.match(r'^\s+Program PWSCF\s+([\w.]+)\s+starts', lines[j])
        if m:
            parser.set_parameter("App:Version", m.group(1).strip())

        m = re.match(r'^\s+number of atoms/cell\s*=\s*([\d.]+)', lines[j])
        if m:
            parser.set_parameter("Input:Number of Atoms per Cell",
                                 m.group(1).strip())

        m = re.match(r'^\s+number of atomic types\s*=\s*([\d.]+)', lines[j])
        if m:
            parser.set_parameter("Input:Number of Atomic Types",
                                 m.group(1).strip())

        m = re.match(r'^\s+number of electrons\s*=\s*([\d.]+)', lines[j])
        if m:
            parser.set_parameter("Input:Number of Electrons",
                                 m.group(1).strip())

        m = re.match(r'^\s+per-process dynamical memory:\s*([\d.]+)\s*Mb',
                     lines[j])
        if m:
            parser.set_statistic("Per-Process Dynamical Memory",
                                 (m.group(1).strip()), "MByte")

        m = re.match(r'^\s+init_run\s+:\s*([\d.]+)s CPU', lines[j])
        if m:
            parser.set_statistic("Time Spent in Program Initialization",
                                 (m.group(1).strip()), "Second")

        m = re.match(r'^\s+electrons\s+:\s*([\d.]+)s CPU', lines[j])
        if m:
            parser.set_statistic("Time Spent in Electron Energy Calculation",
                                 (m.group(1).strip()), "Second")

        m = re.match(r'^\s+forces\s+:\s*([\d.]+)s CPU', lines[j])
        if m:
            parser.set_statistic("Time Spent in Force Calculation",
                                 (m.group(1).strip()), "Second")

        m = re.match(r'^\s+stress\s+:\s*([\d.]+)s CPU', lines[j])
        if m:
            parser.set_statistic("Time Spent in Stress Calculation",
                                 (m.group(1).strip()), "Second")

        m = re.match(r'^\s+update_pot\s+:\s*([\d.]+)s CPU', lines[j])
        if m:
            parser.set_statistic(
                "Time Spent in Potential Updates (Charge Density and Wavefunctions Extrapolations)",
                float(m.group(1).strip()), "Second")

        m = re.match(r'^\s+PWSCF\s+:(.+CPU.+)', lines[j])
        if m:
            run_times = m.group(1).strip().split(',')
            for run_time in run_times:
                v = run_time.split()
                if len(v) > 1:
                    if v[0].lower().find("m") >= 0:
                        m = re.match(r'^([0-9]+)m([0-9.]+)s', v[0])
                        sec = float(m.group(1)) * 60.0 + float(m.group(2))
                    else:
                        m = re.match(r'^([0-9.]+)s', v[0])
                        sec = float(m.group(1))
                    if v[1].upper().find("CPU") >= 0:
                        parser.set_statistic("User Time", sec, "Second")
                    if v[1].upper().find("WALL") >= 0:
                        parser.set_statistic("Wall Clock Time", sec, "Second")

        if re.match(r'^\s+JOB DONE', lines[j]):
            parser.successfulRun = True
        j += 1
    if __name__ == "__main__":
        # output for testing purpose
        print("parsing complete:", parser.parsing_complete(True))
        if hasattr(parser, 'successfulRun'):
            print("successfulRun", parser.successfulRun)
        parser.print_params_stats_as_must_have()
        print(parser.get_xml())

    # return complete XML overwize return None
    return parser.get_xml()
Beispiel #11
0
def process_appker_output(appstdout=None,
                          stdout=None,
                          stderr=None,
                          geninfo=None,
                          resource_appker_vars=None):
    # set App Kernel Description
    parser = AppKerOutputParser(
        name='lammps',
        version=1,
        description=
        "LAMMPS: Large-scale Atomic/Molecular Massively Parallel Simulator",
        url='http://lammps.sandia.gov',
        measurement_name='LAMMPS')
    # set obligatory parameters and statistics
    # set common parameters and statistics
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('App:Version')
    parser.add_must_have_parameter('Input:Number of Atoms')
    parser.add_must_have_parameter('Input:Number of Steps')
    parser.add_must_have_parameter('Input:Timestep')

    parser.add_must_have_statistic('Molecular Dynamics Simulation Performance')
    parser.add_must_have_statistic('Per-Process Memory')
    parser.add_must_have_statistic('Time Spent in Bond Potential Calculation')
    parser.add_must_have_statistic('Time Spent in Communication')
    parser.add_must_have_statistic(
        'Time Spent in Long-Range Coulomb Potential (K-Space) Calculation')
    parser.add_must_have_statistic('Time Spent in Neighbor List Regeneration')
    parser.add_must_have_statistic(
        'Time Spent in Pairwise Potential Calculation')
    parser.add_must_have_statistic('Wall Clock Time')

    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo,
                                         resource_appker_vars)

    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # process the output
    parser.successfulRun = False
    wall_clock_time = None
    simulation_units = None
    num_steps = None
    step_size = None
    j = 0
    while j < len(lines):

        m = re.match(r'^LAMMPS\s+\(([\w ]+)\)', lines[j])
        if m:
            parser.set_parameter("App:Version", m.group(1).strip())

        m = re.match(r'^Memory usage per processor = ([\d.]+) Mbyte', lines[j])
        if m:
            parser.set_statistic("Per-Process Memory",
                                 m.group(1).strip(), "MByte")

        m = re.match(r'^Loop time of ([\d.]+) on', lines[j])
        if m:
            parser.successfulRun = True
            wall_clock_time = float(m.group(1).strip())
            parser.set_statistic("Wall Clock Time", wall_clock_time, "Second")
            m1 = re.search(r'(\d+) atoms', lines[j])
            if m1:
                parser.set_parameter("Input:Number of Atoms",
                                     m1.group(1).strip())

        m = re.match(r'^units\s+(\w+)', lines[j])
        if m:
            simulation_units = m.group(1).strip().lower()

        m = re.match(r'^run\s+(\d+)', lines[j])
        if m:
            num_steps = int(m.group(1).strip())
            parser.set_parameter("Input:Number of Steps", num_steps)

        m = re.match(r'^timestep\s+([\d.]+)', lines[j])
        if m:
            step_size = float(m.group(1).strip())

        m = re.match(r'^Pair\s+time.+= ([\d.]+)', lines[j])
        if parser.successfulRun and m:
            parser.set_statistic(
                "Time Spent in Pairwise Potential Calculation",
                m.group(1).strip(), "Second")

        m = re.match(r'^Bond\s+time.+= ([\d.]+)', lines[j])
        if parser.successfulRun and m:
            parser.set_statistic("Time Spent in Bond Potential Calculation",
                                 m.group(1).strip(), "Second")

        m = re.match(r'^Kspce\s+time.+= ([\d.]+)', lines[j])
        if parser.successfulRun and m:
            parser.set_statistic(
                "Time Spent in Long-Range Coulomb Potential (K-Space) Calculation",
                m.group(1).strip(), "Second")

        m = re.match(r'^Neigh\s+time.+= ([\d.]+)', lines[j])
        if parser.successfulRun and m:
            parser.set_statistic("Time Spent in Neighbor List Regeneration",
                                 m.group(1).strip(), "Second")

        m = re.match(r'^Comm\s+time.+= ([\d.]+)', lines[j])
        if parser.successfulRun and m:
            parser.set_statistic("Time Spent in Communication",
                                 m.group(1).strip(), "Second")

        j += 1

    if parser.successfulRun and num_steps and simulation_units != "lj":
        # The default value for $stepSize is (see http://lammps.sandia.gov/doc/units.html):
        #
        #   0.005 tau for $simulationUnits eq "lj"
        #   1e-15 second for $simulationUnits eq "real" or "metal"
        #   1e-18 second for $simulationUnits eq "electron"
        #   1e-8  second for $simulationUnits eq "si" or "cgs"

        # If $simulationUnits is (see http://lammps.sandia.gov/doc/units.html)
        #
        #  "lj", the unit for $stepSize is tau
        #  "real" or "electron", the unit for $stepSize is 1e-15 second
        #  "metal", the unit for $stepSize is 1e-12 second
        #  "si" or "cgs", the unit for $stepSize is second

        # The default $simulationUnits is "lj"
        #
        # We ignore "lj" since "lj" is unitless.
        if step_size is None:
            if simulation_units == "real":
                step_size = 1.0
            if simulation_units.find("electron") >= 0 or simulation_units.find(
                    "metal") >= 0:
                step_size = 0.001
            if simulation_units.find("si") >= 0 or simulation_units.find(
                    "cgs") >= 0:
                step_size = 1.0e-8

        step_size_in_sec = step_size
        if step_size:
            if simulation_units.find("electron") >= 0 or simulation_units.find(
                    "real") >= 0:
                step_size_in_sec = step_size * 1.0e-15
            if simulation_units == "metal":
                step_size_in_sec = step_size * 1.0e-12
        if step_size_in_sec:
            parser.set_parameter("Input:Timestep", step_size_in_sec,
                                 "Second per Step")
            parser.set_statistic(
                "Molecular Dynamics Simulation Performance",
                1.0e-9 * (1.0e9 * step_size_in_sec * num_steps) /
                (wall_clock_time / 86400.0), "Second per Day")
    if __name__ == "__main__":
        # output for testing purpose
        print("parsing complete:", parser.parsing_complete())
        parser.print_params_stats_as_must_have()
        print(parser.get_xml())

    # return complete XML overwize return None
    return parser.get_xml()
Beispiel #12
0
def process_appker_output(appstdout=None,
                          stdout=None,
                          stderr=None,
                          geninfo=None,
                          proclog=None,
                          resource_appker_vars=None):
    # set App Kernel Description
    parser = AppKerOutputParser(
        name='gamess',
        version=1,
        description=
        "Gamess: General Atomic and Molecular Electronic Structure System",
        url='http://www.msg.ameslab.gov',
        measurement_name='Gamess')
    # set obligatory parameters and statistics
    # set common parameters and statistics
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('App:Version')

    parser.add_must_have_statistic('Wall Clock Time')
    parser.add_must_have_statistic('User Time')
    parser.add_must_have_statistic('Time Spent in MP2 Energy Calculation')
    parser.add_must_have_statistic(
        'Time Spent in Restricted Hartree-Fock Calculation')
    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo,
                                         resource_appker_vars)

    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # process the output
    start_time = None
    end_time = None
    mp2_energy_calculation_time = 0.0
    rhf_calculation_time = 0.0
    efficiency = None
    j = 0
    while j < len(lines):

        m = re.search(r'GAMESS VERSION = ([^*]+)', lines[j])
        if m:
            parser.set_parameter("App:Version", m.group(1).strip())

        m = re.search(
            r'PARALLEL VERSION RUNNING ON\s*([\d.]+) PROCESSORS IN\s*([\d.]+) NODE',
            lines[j])
        if m:
            parser.set_parameter("App:NCores", m.group(1).strip())
            parser.set_parameter("App:NNodes", m.group(2).strip())

        m = re.search(r'EXECUTION OF GAMESS BEGUN (.+)', lines[j])
        if m:
            start_time = parser.get_datetime_local(m.group(1).strip())

        m = re.search(r'EXECUTION OF GAMESS TERMINATED NORMALLY (.+)',
                      lines[j])
        if m:
            end_time = parser.get_datetime_local(m.group(1).strip())

        if re.search(r'DONE WITH MP2 ENERGY', lines[j]):
            j += 1
            m = re.search(r'STEP CPU TIME=\s*([\d.]+)', lines[j])
            if m:
                mp2_energy_calculation_time += float(m.group(1).strip())

        if re.search(r'END OF RHF CALCULATION', lines[j]):
            j += 1
            m = re.search(r'STEP CPU TIME=\s*([\d.]+)', lines[j])
            if m:
                rhf_calculation_time += float(m.group(1).strip())

        m = re.search(r'TOTAL WALL CLOCK TIME.+CPU UTILIZATION IS\s+([\d.]+)',
                      lines[j])
        if m:
            efficiency = float(m.group(1).strip())

        j += 1

    if start_time and end_time:
        walltime = total_seconds(end_time - start_time)
        if walltime >= 0.0:
            parser.set_statistic('Wall Clock Time', str(walltime), "Second")
            if efficiency:
                parser.set_statistic("User Time",
                                     str((0.01 * efficiency * walltime)),
                                     "Second")

    parser.set_statistic("Time Spent in MP2 Energy Calculation",
                         str(mp2_energy_calculation_time), "Second")
    parser.set_statistic("Time Spent in Restricted Hartree-Fock Calculation",
                         str(rhf_calculation_time), "Second")

    if "attemptsToLaunch" in parser.geninfo:
        parser.set_statistic("Attempts to Launch",
                             parser.geninfo['attemptsToLaunch'])
    else:
        parser.set_statistic("Attempts to Launch", 1)

    if __name__ == "__main__":
        # output for testing purpose
        print(("parsing complete:", parser.parsing_complete()))
        parser.print_params_stats_as_must_have()
        print((parser.get_xml()))

    # return complete XML overwize return None
    return parser.get_xml()
Beispiel #13
0
def process_appker_output(appstdout=None,
                          stdout=None,
                          stderr=None,
                          geninfo=None,
                          proclog=None,
                          resource_appker_vars=None):
    # set App Kernel Description
    parser = AppKerOutputParser(name='hpcg',
                                version=1,
                                description="HPCG Benchmark",
                                url='http://www.hpcg-benchmark.org/index.html',
                                measurement_name='HPCG')
    # set obligatory parameters and statistics
    # set common parameters and statistics
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('App:ExeBinSignature')
    parser.add_must_have_parameter('App:Version')
    parser.add_must_have_parameter('Input:Distributed Processes')
    parser.add_must_have_parameter('Input:Global Problem Dimensions Nx')
    parser.add_must_have_parameter('Input:Global Problem Dimensions Ny')
    parser.add_must_have_parameter('Input:Global Problem Dimensions Nz')
    parser.add_must_have_parameter('Input:Local Domain Dimensions Nx')
    parser.add_must_have_parameter('Input:Local Domain Dimensions Ny')
    parser.add_must_have_parameter('Input:Local Domain Dimensions Nz')
    parser.add_must_have_parameter('Input:Number of Coarse Grid Levels')
    parser.add_must_have_parameter('Input:Threads per processes')
    parser.add_must_have_parameter('RunEnv:CPU Speed')
    parser.add_must_have_parameter('RunEnv:Nodes')

    parser.add_must_have_statistic('Floating-Point Performance, Raw DDOT')
    parser.add_must_have_statistic('Floating-Point Performance, Raw MG')
    parser.add_must_have_statistic('Floating-Point Performance, Raw SpMV')
    parser.add_must_have_statistic('Floating-Point Performance, Raw Total')
    parser.add_must_have_statistic('Floating-Point Performance, Raw WAXPBY')
    parser.add_must_have_statistic('Floating-Point Performance, Total')
    parser.add_must_have_statistic('Memory Bandwidth, Read')
    parser.add_must_have_statistic('Memory Bandwidth, Total')
    parser.add_must_have_statistic('Memory Bandwidth, Write')
    parser.add_must_have_statistic('Setup Time')
    parser.add_must_have_statistic('Wall Clock Time')

    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo,
                                         resource_appker_vars)

    if hasattr(parser, 'appKerWallClockTime'):
        parser.set_statistic("Wall Clock Time",
                             total_seconds(parser.appKerWallClockTime),
                             "Second")

    # get path to YAML file
    # read data
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # Parse YAML lines because YAML is often malformed
    yaml_lines = []
    # get yaml lines from appstdout
    bool_in_yaml_section = False
    for line in lines:
        if re.match(r"^====== .+\.yaml End   ======", line):
            break

        if bool_in_yaml_section:
            yaml_lines.append(line)

        if re.match(r"^====== .+\.yaml Start ======", line):
            bool_in_yaml_section = True

    from pprint import pprint
    import yaml
    # fix some issues with yaml
    if re.search(r"After confirmation please upload results from the YAML",
                 yaml_lines[-1]):
        yaml_lines.pop()
    if re.search(r"You have selected the QuickPath option", yaml_lines[-1]):
        yaml_lines.pop()

    yaml_text = "".join(yaml_lines)

    yaml_text = re.sub(r"^ {6}HPCG 2\.4 Rating \(for historical value\) is:",
                       "  HPCG 2.4 Rating (for historical value) is:",
                       yaml_text,
                       flags=re.M)

    results_yaml = yaml.load(yaml_text)

    # Set Parameters
    # App version
    app_version_list = []
    for ver in [x for x in results_yaml.keys() if re.search("version", x)]:
        app_version_list.append(ver + " " + str(results_yaml[ver]))
    app_version = ", ".join(app_version_list)
    parser.set_parameter('App:Version', app_version)

    # Problem size
    parser.set_parameter(
        'Input:Number of Coarse Grid Levels',
        results_yaml['Multigrid Information']['Number of coarse grid levels'])

    parser.set_parameter(
        'Input:Global Problem Dimensions Nx',
        results_yaml['Global Problem Dimensions']['Global nx'])
    parser.set_parameter(
        'Input:Global Problem Dimensions Ny',
        results_yaml['Global Problem Dimensions']['Global ny'])
    parser.set_parameter(
        'Input:Global Problem Dimensions Nz',
        results_yaml['Global Problem Dimensions']['Global nz'])

    parser.set_parameter('Input:Local Domain Dimensions Nx',
                         results_yaml['Local Domain Dimensions']['nx'])
    parser.set_parameter('Input:Local Domain Dimensions Ny',
                         results_yaml['Local Domain Dimensions']['ny'])
    parser.set_parameter('Input:Local Domain Dimensions Nz',
                         results_yaml['Local Domain Dimensions']['nz'])

    parser.set_parameter(
        'Input:Distributed Processes',
        results_yaml['Machine Summary']['Distributed Processes'])
    parser.set_parameter(
        'Input:Threads per processes',
        results_yaml['Machine Summary']['Threads per processes'])

    if "cpu_speed" in parser.geninfo:
        ll = parser.geninfo["cpu_speed"].splitlines()
        cpu_speed_max = 0.0
        for l in ll:
            m = re.search(r'([\d.]+)$', l)
            if m:
                v = float(m.group(1).strip())
                if v > cpu_speed_max:
                    cpu_speed_max = v
        if cpu_speed_max > 0.0:
            parser.set_parameter("RunEnv:CPU Speed", cpu_speed_max, "MHz")

    # Set Statistics
    parser.successfulRun = results_yaml['Reproducibility Information'][
        'Result'] == 'PASSED'

    parser.set_statistic('Setup Time',
                         results_yaml['Setup Information']['Setup Time'],
                         'Seconds')

    parser.set_statistic('Memory Bandwidth, Read',
                         results_yaml['GB/s Summary']['Raw Read B/W'], 'GB/s')
    parser.set_statistic('Memory Bandwidth, Write',
                         results_yaml['GB/s Summary']['Raw Write B/W'], 'GB/s')
    parser.set_statistic('Memory Bandwidth, Total',
                         results_yaml['GB/s Summary']['Raw Total B/W'], 'GB/s')

    parser.set_statistic(
        'Floating-Point Performance, Total',
        results_yaml['__________ Final Summary __________']
        ['HPCG result is VALID with a GFLOP/s rating of'], 'GFLOP/s')

    parser.set_statistic('Floating-Point Performance, Raw DDOT',
                         results_yaml['GFLOP/s Summary']['Raw DDOT'],
                         'GFLOP/s')
    parser.set_statistic('Floating-Point Performance, Raw WAXPBY',
                         results_yaml['GFLOP/s Summary']['Raw WAXPBY'],
                         'GFLOP/s')
    parser.set_statistic('Floating-Point Performance, Raw SpMV',
                         results_yaml['GFLOP/s Summary']['Raw SpMV'],
                         'GFLOP/s')
    parser.set_statistic('Floating-Point Performance, Raw MG',
                         results_yaml['GFLOP/s Summary']['Raw MG'], 'GFLOP/s')
    parser.set_statistic('Floating-Point Performance, Raw Total',
                         results_yaml['GFLOP/s Summary']['Raw Total'],
                         'GFLOP/s')

    if __name__ == "__main__":
        # output for testing purpose
        print("parsing complete:", parser.parsing_complete(verbose=True))
        parser.print_params_stats_as_must_have()
        print(parser.get_xml())

    # return complete XML otherwise return None
    return parser.get_xml()
Beispiel #14
0
def process_appker_output(appstdout=None, stdout=None, stderr=None, geninfo=None, proclog=None, 
                          resource_appker_vars=None):
    # set App Kernel Description
    parser = AppKerOutputParser(
        name='amber',
        version=1,
        description="Amber: Assisted Model Building with Energy Refinement",
        url='http://ambermd.org',
        measurement_name='Amber'
    )
    # set obligatory parameters and statistics
    # set common parameters and statistics
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('App:Version')
    parser.add_must_have_parameter('Input:Coordinate File')
    parser.add_must_have_parameter('Input:Number of Angles')
    parser.add_must_have_parameter('Input:Number of Atoms')
    parser.add_must_have_parameter('Input:Number of Bonds')
    parser.add_must_have_parameter('Input:Number of Dihedrals')
    parser.add_must_have_parameter('Input:Number of Steps')
    parser.add_must_have_parameter('Input:Structure File')
    parser.add_must_have_parameter('Input:Timestep')

    parser.add_must_have_statistic('Molecular Dynamics Simulation Performance')
    parser.add_must_have_statistic('Time Spent in Direct Force Calculation')
    parser.add_must_have_statistic('Time Spent in Non-Bond List Regeneration')
    parser.add_must_have_statistic('Time Spent in Reciprocal Force Calculation')
    parser.add_must_have_statistic('Wall Clock Time')

    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo, resource_appker_vars)

    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # process the output
    parser.successfulRun = False
    num_steps = 0
    step_size = 0
    j = 0
    while j < len(lines):

        m = re.search(r'Amber\s+([0-9a-zA-Z]+)\s+SANDER\s+20[0-9]+', lines[j])
        if m:
            parser.set_parameter("App:Version", "SANDER " + m.group(1))

        m = re.match(r'^\|\s+PMEMD implementation of SANDER, Release\s+([0-9.]+)', lines[j])
        if m:
            parser.set_parameter("App:Version", "PMEMD " + m.group(1))

        m = re.match(r'^\|\s+INPCRD:\s+(\S+)', lines[j])
        if m:
            parser.set_parameter("Input:Coordinate File", m.group(1))

        m = re.match(r'^\|\s+PARM:\s+(\S+)', lines[j])
        if m:
            parser.set_parameter("Input:Structure File", m.group(1))

        if re.search(r'CONTROL\s+DATA\s+FOR\s+THE\s+RUN', lines[j]):
            j += 2
            for k in range(256):
                if re.match(r'^-----------------------------', lines[j]):
                    break

                m = re.search(r'nstlim\s+=\s+([0-9]+)', lines[j])
                if m:
                    num_steps = int(m.group(1).strip())
                    parser.set_parameter("Input:Number of Steps", num_steps)

                m = re.search(r'dt\s+=\s+([0-9.]+)', lines[j])
                if m:
                    step_size = 1000.0 * float(m.group(1).strip())
                    parser.set_parameter("Input:Timestep", step_size * 1e-15, "Second per Step")

                j += 1

        if re.search(r'RESOURCE\s+USE', lines[j]):
            j += 2
            num_bonds = 0
            num_angles = 0
            num_dihedrals = 0
            for k in range(256):
                if re.match(r'^-----------------------------', lines[j]):
                    break

                m = re.search(r'NATOM\s+=\s+([0-9]+)', lines[j])
                if m:
                    parser.set_parameter("Input:Number of Atoms", m.group(1).strip())

                m = re.search(r'NBONH\s+=\s+([0-9]+)', lines[j])
                if m:
                    num_bonds += int(m.group(1).strip())

                m = re.search(r'NBONA\s+=\s+([0-9]+)', lines[j])
                if m:
                    num_bonds += int(m.group(1).strip())

                m = re.search(r'NTHETH\s+=\s+([0-9]+)', lines[j])
                if m:
                    num_angles += int(m.group(1).strip())

                m = re.search(r'NTHETA\s+=\s+([0-9]+)', lines[j])
                if m:
                    num_angles += int(m.group(1).strip())

                m = re.search(r'NPHIH\s+=\s+([0-9]+)', lines[j])
                if m:
                    num_dihedrals += int(m.group(1).strip())

                m = re.search(r'NPHIA\s+=\s+([0-9]+)', lines[j])
                if m:
                    num_dihedrals += int(m.group(1).strip())

                j += 1

            if num_bonds > 0:
                parser.set_parameter("Input:Number of Bonds", num_bonds)
            if num_angles > 0:
                parser.set_parameter("Input:Number of Angles", num_angles)
            if num_dihedrals > 0:
                parser.set_parameter("Input:Number of Dihedrals", num_dihedrals)

        if re.search(r'PME Nonbond Pairlist CPU Time', lines[j]):
            j += 2
            for k in range(20):
                m = re.search(r'Total\s+([\d.]+)', lines[j])
                if m:
                    parser.set_statistic("Time Spent in Non-Bond List Regeneration", m.group(1), "Second")
                    break
                j += 1
        if re.search(r'PME Direct Force CPU Time', lines[j]):
            j += 2
            for k in range(20):
                m = re.search(r'Total\s+([\d.]+)', lines[j])
                if m:
                    parser.set_statistic("Time Spent in Direct Force Calculation", m.group(1), "Second")
                    break
                j += 1
        if re.search(r'PME Reciprocal Force CPU Time', lines[j]):
            j += 2
            for k in range(20):
                m = re.search(r'Total\s+([\d.]+)', lines[j])
                if m:
                    parser.set_statistic("Time Spent in Reciprocal Force Calculation", m.group(1), "Second")
                    break
                j += 1
        m = re.match(r'^\|\s+Master Total wall time:\s+([0-9.]+)\s+seconds', lines[j])
        if m:
            parser.set_statistic("Wall Clock Time", m.group(1), "Second")
            parser.successfulRun = True

            # calculate the performance
            simulation_time = step_size * num_steps * 0.000001  # measured in nanoseconds
            if simulation_time > 0.0:
                parser.set_statistic("Molecular Dynamics Simulation Performance",
                                     1.e-9 * simulation_time / (float(m.group(1)) / 86400.0), "Second per Day")

        j += 1

    if __name__ == "__main__":
        # output for testing purpose
        print("parsing complete:", parser.parsing_complete())
        parser.print_params_stats_as_must_have()
        print(parser.get_xml())

    # return complete XML overwize return None
    return parser.get_xml()
Beispiel #15
0
def process_appker_output(appstdout=None, stdout=None, stderr=None, geninfo=None, resource_appker_vars=None):
    # set App Kernel Description
    parser = AppKerOutputParser(
        name='enzo',
        version=1,
        description="Enzo: an Adaptive Mesh Refinement Code for Astrophysics",
        url='http://enzo-project.org',
        measurement_name='Enzo'
    )
    # set obligatory parameters and statistics
    # set common parameters and statistics
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('App:Version')
    parser.add_must_have_statistic('Wall Clock Time')

    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo, resource_appker_vars)

    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()
    parser.set_parameter("App:Version", "unknown")
    # process the output
    successful_run = False
    j = 0
    while j < len(lines):
        m = re.match(r'^Mercurial Branch\s+(\S+)', lines[j])
        if m:
            branch = m.group(1)
            revision = ""
            if j + 1 < len(lines):
                m = re.match(r'^Mercurial Revision\s+(\S+)', lines[j + 1])
                if m:
                    revision = m.group(1)
            parser.set_parameter("App:Version", "Branch:" + branch + " Revision:" + revision)

        m = re.match(r'^Time\s*=\s*([0-9.]+)\s+CycleNumber\s*=\s*([0-9]+)\s+Wallclock\s*=\s*([0-9.]+)', lines[j])
        if m:
            parser.set_statistic("Final Simulation Time", m.group(1), "Enzo Time Unit")
            parser.set_statistic("Total Cycles", m.group(2))
            parser.set_statistic("Wall Clock Time", m.group(3), "Second")
            successful_run = True

        m = re.match(r'^Successful run, exiting.', lines[j])
        if m:
            successful_run = True

        # performance
        m = re.match(r'^Cycle_Number\s+([0-9]+)', lines[j])
        if m:
            j += 1
            performance_metrics = {}
            while j < len(lines):
                if lines[j].strip() != "":
                    v = lines[j].strip().split()
                    if v[0] not in performance_metrics:
                        performance_metrics[v[0]] = float(v[1])
                    else:
                        performance_metrics[v[0]] += float(v[1])
                else:
                    if j + 1 < len(lines):
                        m = re.match(r'^Cycle_Number\s+([0-9]+)', lines[j + 1])
                        if m:
                            pass
                        else:
                            break
                    else:
                        break
                j += 1

            metric = "CommunicationTranspose"
            if metric in performance_metrics:
                parser.set_statistic("Communication Transpose Time", performance_metrics[metric], "Second")

            metric = "ComputePotentialFieldLevelZero"
            if metric in performance_metrics:
                parser.set_statistic("Gravitational Potential Field Computing Time", performance_metrics[metric],
                                     "Second")

            metric = "EvolvePhotons"
            if metric in performance_metrics:
                parser.set_statistic("Radiative Transfer Calculation Time", performance_metrics[metric], "Second")

            metric = "Group_WriteAllData"
            if metric in performance_metrics:
                parser.set_statistic("All Data Group Write Time", performance_metrics[metric], "Second")

            metric = "Level_00"
            if metric in performance_metrics:
                parser.set_statistic("All Grid Level 00 Calculation Time", performance_metrics[metric], "Second")

            metric = "Level_01"
            if metric in performance_metrics:
                parser.set_statistic("All Grid Level 01 Calculation Time", performance_metrics[metric], "Second")

            metric = "Level_02"
            if metric in performance_metrics:
                parser.set_statistic("All Grid Level 02 Calculation Time", performance_metrics[metric], "Second")

            metric = "RebuildHierarchy"
            if metric in performance_metrics:
                parser.set_statistic("Grid Hierarchy Rebuilding Time", performance_metrics[metric], "Second")

            metric = "SetBoundaryConditions"
            if metric in performance_metrics:
                parser.set_statistic("Boundary Conditions Setting Time", performance_metrics[metric], "Second")

            metric = "SolveForPotential"
            if metric in performance_metrics:
                parser.set_statistic("Poisson Equation Solving Time", performance_metrics[metric], "Second")

            metric = "SolveHydroEquations"
            if metric in performance_metrics:
                parser.set_statistic("Hydro Equations Solving Time", performance_metrics[metric], "Second")

            metric = "Total"
            if metric in performance_metrics:
                parser.set_statistic("Total Time Spent in Cycles", performance_metrics[metric], "Second")

        j += 1
    parser.successfulRun = successful_run

    if __name__ == "__main__":
        # output for testing purpose
        print(("parsing complete:", parser.parsing_complete()))
        parser.print_params_stats_as_must_have()
        print((parser.get_xml()))

    # return complete XML overwize return None
    return parser.get_xml()
Beispiel #16
0
def process_appker_output(appstdout=None,
                          stdout=None,
                          stderr=None,
                          geninfo=None,
                          resource_appker_vars=None):
    # set App Kernel Description
    parser = AppKerOutputParser(
        name='charmm',
        version=1,
        description="CHARMM: Chemistry at Harvard Macromolecular Mechanics",
        url='http://www.charmm.org',
        measurement_name='CHARMM')
    # set obligatory parameters and statistics
    # set common parameters and statistics
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('App:Version')
    parser.add_must_have_parameter('Input:Number of Angles')
    parser.add_must_have_parameter('Input:Number of Atoms')
    parser.add_must_have_parameter('Input:Number of Bonds')
    parser.add_must_have_parameter('Input:Number of Dihedrals')
    parser.add_must_have_parameter('Input:Number of Steps')
    parser.add_must_have_parameter('Input:Timestep')

    parser.add_must_have_statistic('Molecular Dynamics Simulation Performance')
    parser.add_must_have_statistic('Time Spent in External Energy Calculation')
    parser.add_must_have_statistic('Time Spent in Integration')
    parser.add_must_have_statistic('Time Spent in Internal Energy Calculation')
    parser.add_must_have_statistic('Time Spent in Non-Bond List Generation')
    parser.add_must_have_statistic(
        'Time Spent in Waiting (Load Unbalance-ness)')
    parser.add_must_have_statistic('User Time')
    parser.add_must_have_statistic('Wall Clock Time')

    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo,
                                         resource_appker_vars)

    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # process the output
    parser.successfulRun = False
    wall_clock_time = 0.0
    num_steps = 0
    step_size = 0.0
    time_breakdown_columns = None
    num_atoms = 0
    num_bonds = 0
    num_angles = 0
    num_dihedrals = 0

    j = 0
    while j < len(lines):

        m0 = re.search(r'\s+Chemistry at HARvard Macromolecular Mechanics',
                       lines[j])
        m1 = re.search(r'\sVersion\s+([\da-zA-Z]+)', lines[j + 1])
        if m0 and m1:
            parser.set_parameter("App:Version", m1.group(1).strip())

        if re.search(r'Summary of the structure file counters', lines[j]):
            j += 1
            for k in range(256):
                if re.search(r'CHARMM>', lines[j]):
                    break

                m = re.search(r'Number of atoms\s+=\s+(\d+)', lines[j])
                if m:
                    num_atoms += int(m.group(1).strip())

                m = re.search(r'Number of bonds\s+=\s+(\d+)', lines[j])
                if m:
                    num_bonds += int(m.group(1).strip())

                m = re.search(r'Number of angles\s+=\s+(\d+)', lines[j])
                if m:
                    num_angles += int(m.group(1).strip())

                m = re.search(r'Number of dihedrals\s+=\s+(\d+)', lines[j])
                if m:
                    num_dihedrals += int(m.group(1).strip())

                j += 1

        if re.search(r'<MAKGRP> found', lines[j]):
            j += 1
            for k in range(256):
                if re.search(r'NUMBER OF DEGREES OF FREEDOM', lines[j]):
                    break

                m = re.search(r'NSTEP\s+=\s+(\d+)', lines[j])
                if m:
                    num_steps = int(m.group(1).strip())
                    parser.set_parameter("Input:Number of Steps", num_steps)

                if re.search(r'TIME STEP\s+=', lines[j]):
                    m = re.search(r'([\d\-Ee.]+)\s+PS', lines[j])
                    if m:
                        step_size = 1000.0 * float(m.group(1).strip())
                        parser.set_parameter("Input:Timestep",
                                             step_size * 1e-15,
                                             "Second per Step")
                j += 1

        if re.search(r'NORMAL TERMINATION BY NORMAL STOP', lines[j]):
            parser.successfulRun = True

        if re.search(r'JOB ACCOUNTING INFORMATION', lines[j]):
            parser.successfulRun = True

            j += 1
            for k in range(256):
                if j > len(lines) - 1:
                    break
                m = re.search(r'ELAPSED TIME:\s*([\d.]+)\s*MINUTES', lines[j])
                if m:
                    wall_clock_time = 60.0 * float(m.group(1).strip())
                    parser.set_statistic("Wall Clock Time", wall_clock_time,
                                         "Second")

                m = re.search(r'CPU TIME:\s*([\d.]+)\s*MINUTES', lines[j])
                if m:
                    parser.set_statistic("User Time",
                                         60.0 * float(m.group(1).strip()),
                                         "Second")

                m = re.search(r'ELAPSED TIME:\s*([\d.]+)\s*SECONDS', lines[j])
                if m:
                    wall_clock_time = float(m.group(1).strip())
                    parser.set_statistic("Wall Clock Time", wall_clock_time,
                                         "Second")

                m = re.search(r'CPU TIME:\s*([\d.]+)\s*SECONDS', lines[j])
                if m:
                    parser.set_statistic("User Time",
                                         m.group(1).strip(), "Second")

                j += 1
            if j > len(lines) - 1:
                break

        if re.search(r'Parallel load balance \(sec', lines[j]):
            j += 1
            # grab the column headers from the output, e.g.
            #
            # Parallel load balance (sec.):
            # Node Eext      Eint   Wait    Comm    List   Integ   Total
            #   0   205.5     6.4     1.2    31.2    23.2     2.8   270.4
            #   1   205.2     7.3     1.1    31.2    23.3     3.2   271.2
            #   2   205.2     7.7     0.6    32.3    23.3     3.2   272.3
            #   3   205.2     7.8     0.6    32.1    23.3     3.3   272.3
            # PARALLEL> Average timing for all nodes:
            #   4   205.3     7.3     0.9    31.7    23.3     3.1   271.6
            time_breakdown_columns = lines[j].strip().split()

        if re.search(r'PARALLEL>\s*Average timing for all nodes',
                     lines[j]) and time_breakdown_columns:
            j += 1
            time_breakdown = lines[j].strip().split()
            if len(time_breakdown_columns) == len(time_breakdown):
                for k in range(len(time_breakdown)):
                    if time_breakdown_columns[k] == "Eext":
                        parser.set_statistic(
                            "Time Spent in External Energy Calculation",
                            time_breakdown[k], "Second")
                    if time_breakdown_columns[k] == "Eint":
                        parser.set_statistic(
                            "Time Spent in Internal Energy Calculation",
                            time_breakdown[k], "Second")
                    if time_breakdown_columns[k] == "Wait":
                        parser.set_statistic(
                            "Time Spent in Waiting (Load Unbalance-ness)",
                            time_breakdown[k], "Second")
                    if time_breakdown_columns[k] == "List":
                        parser.set_statistic(
                            "Time Spent in Non-Bond List Generation",
                            time_breakdown[k], "Second")
                    if time_breakdown_columns[k] == "Integ":
                        parser.set_statistic("Time Spent in Integration",
                                             time_breakdown[k], "Second")

        j += 1
    if num_atoms > 0:
        parser.set_parameter("Input:Number of Atoms", num_atoms)
    if num_bonds > 0:
        parser.set_parameter("Input:Number of Bonds", num_bonds)
    if num_angles > 0:
        parser.set_parameter("Input:Number of Angles", num_angles)
    if num_dihedrals > 0:
        parser.set_parameter("Input:Number of Dihedrals", num_dihedrals)

    if wall_clock_time > 0.0 and num_steps > 0 and step_size > 0.0:
        # $stepSize is in femtoseconds
        # $wallClockTime is in seconds
        parser.set_statistic("Molecular Dynamics Simulation Performance",
                             (1e-6 * step_size * num_steps) /
                             (wall_clock_time / 86400.0) * 1e-9,
                             "Second per Day")

    if __name__ == "__main__":
        # output for testing purpose
        print("parsing complete:", parser.parsing_complete())
        parser.print_params_stats_as_must_have()
        print(parser.get_xml())

    # return complete XML overwize return None
    return parser.get_xml()
Beispiel #17
0
def process_appker_output(appstdout=None,
                          stdout=None,
                          stderr=None,
                          geninfo=None,
                          resource_appker_vars=None):
    # set App Kernel Description
    if resource_appker_vars is not None and 'app' in resource_appker_vars and 'name' in resource_appker_vars[
            'app']:
        akname = resource_appker_vars['app']['name']
    else:
        akname = 'unknown'

    # initiate parser
    parser = AppKerOutputParser(name=akname)
    # set obligatory parameters and statistics
    # set common parameters and statistics (App:ExeBinSignature and RunEnv:Nodes)
    parser.add_common_must_have_params_and_stats()
    # set app kernel custom sets
    parser.add_must_have_parameter('App:ExeBinSignature')
    parser.add_must_have_parameter('App:Version')
    parser.add_must_have_parameter('Number of Darts Throws')
    parser.add_must_have_parameter('Number of Rounds')
    parser.add_must_have_parameter('RunEnv:Nodes')

    parser.add_must_have_statistic('Darts Throws per Second')
    parser.add_must_have_statistic('Time for PI Calculation')
    parser.add_must_have_statistic('Wall Clock Time')

    # parse common parameters and statistics
    parser.parse_common_params_and_stats(appstdout, stdout, stderr, geninfo)

    if hasattr(parser, 'appKerWallClockTime'):
        parser.set_statistic("Wall Clock Time",
                             parser.appKerWallClockTime.total_seconds(),
                             "Second")

    # Here can be custom output parsing
    # read output
    lines = []
    if os.path.isfile(appstdout):
        fin = open(appstdout, "rt")
        lines = fin.readlines()
        fin.close()

    # process the output
    parser.successfulRun = False
    j = 0
    while j < len(lines):
        m = re.search(r'version:\s+(.+)', lines[j])
        if m:
            parser.set_parameter('App:Version', m.group(1))

        m = re.search(r'number of throws at dartboard:\s+(\d+)', lines[j])
        if m:
            parser.set_parameter('Number of Darts Throws', m.group(1))

        m = re.search(r'number of rounds for dartz throwing\s+(\d+)', lines[j])
        if m:
            parser.set_parameter('Number of Rounds', m.group(1))

        m = re.search(r'Time for PI calculation:\s+([0-9.]+)', lines[j])
        if m:
            parser.set_statistic("Time for PI Calculation", m.group(1),
                                 "Seconds")

        m = re.search(r'Giga Darts Throws per Second \(GDaPS\):\s+([0-9.]+)',
                      lines[j])
        if m:
            parser.set_statistic("Darts Throws per Second", m.group(1),
                                 "GDaPS")

        m = re.search(r'Giga Darts Throws per Second', lines[j])
        if m:
            parser.successfulRun = True

        j += 1

    if __name__ == "__main__":
        # output for testing purpose
        print(("Parsing complete:", parser.parsing_complete(verbose=True)))
        print("Following statistics and parameter can be set as obligatory:")
        parser.print_params_stats_as_must_have()
        print("\nResulting XML:")
        print((parser.get_xml()))

    # return complete XML otherwise return None
    return parser.get_xml()