Source code for spinn_front_end_common.interface.interface_functions.profile_data_gatherer
# Copyright (c) 2017 The University of Manchester
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
from spinn_utilities.progress_bar import ProgressBar
from spinn_front_end_common.data import FecDataView
from spinn_front_end_common.interface.profiling import AbstractHasProfileData
_FMT_A = "{: <{}s} {: <7s} {: <14s} {: <14s} {: <14s}\n"
_FMT_B = "{:-<{}s} {:-<7s} {:-<14s} {:-<14s} {:-<14s}\n"
_FMT_C = "{: <{}s} {: >7d} {: >14.6f} {: >14.6f} {: >14.6f}\n"
[docs]def profile_data_gatherer():
"""
Gets all the profiling data recorded by vertices and writes it to files.
"""
progress = ProgressBar(
FecDataView.get_n_placements(), "Getting profile data")
provenance_file_path = FecDataView.get_app_provenance_dir_path()
# retrieve provenance data from any cores that provide data
for placement in progress.over(FecDataView.iterate_placemements()):
if isinstance(placement.vertex, AbstractHasProfileData):
# get data
profile_data = placement.vertex.get_profile_data(placement)
if profile_data.tags:
_write(placement, profile_data, provenance_file_path)
def _write(p, profile_data, directory):
"""
:param ~.Placement p:
:param ProfileData profile_data:
:param str directory:
"""
max_tag_len = max(len(tag) for tag in profile_data.tags)
file_name = os.path.join(
directory, f"{p.x}_{p.y}_{ p.p}_profile.txt")
# write profile data to file, creating if necessary
with open(file_name, "a", encoding="utf-8") as f:
# Write header
f.write(_FMT_A.format(
"tag", max_tag_len, "n_calls", "mean_ms", "n_calls_per_ts",
"mean_ms_per_ts"))
f.write(_FMT_B.format("", max_tag_len, "", "", "", ""))
# Write content
for tag in profile_data.tags:
f.write(_FMT_C.format(
tag, max_tag_len, profile_data.get_n_calls(tag),
profile_data.get_mean_ms(tag),
profile_data.get_mean_n_calls_per_ts(tag),
profile_data.get_mean_ms_per_ts(tag)))