Source code for spinn_front_end_common.interface.interface_functions.profile_data_gatherer
from spinn_utilities.progress_bar import ProgressBar
# front end common imports
from spinn_front_end_common.interface.profiling.abstract_has_profile_data \
import AbstractHasProfileData
import os
import logging
logger = logging.getLogger(__name__)
[docs]class ProfileDataGatherer(object):
__slots__ = []
def __call__(
self, transceiver, placements, has_ran, provenance_file_path,
run_time_ms, machine_time_step):
"""
:param transceiver: the SpiNNMan interface object
:param placements: The placements of the vertices
:param has_ran: token that states that the simulation has ran
:param provenance_file_path: The location to store the profile data
:param run_time_ms: runtime in ms
:param machine_time_step: machine time step in ms
"""
machine_time_step_ms = machine_time_step / 1000
if not has_ran:
logger.warning("{} skipped as nothing has run "
"".format(self.__class__.__name__))
return
progress = ProgressBar(
placements.n_placements, "Getting profile data")
# retrieve provenance data from any cores that provide data
for placement in progress.over(placements.placements):
if isinstance(placement.vertex, AbstractHasProfileData):
# get data
profile_data = placement.vertex.get_profile_data(
transceiver, placement)
if len(profile_data.tags) > 0:
max_tag_len = max([len(tag) for tag in profile_data.tags])
# write data
file_name = os.path.join(
provenance_file_path, "{}_{}_{}_profile.txt".format(
placement.x, placement.y, placement.p))
# set mode of the file based off if the file already exists
mode = "w"
if os.path.exists(file_name):
mode = "a"
# write profile data to file
with open(file_name, mode) as writer:
writer.write(
"{: <{}s} {: <7s} {: <14s} {: <14s} {: <14s}\n"
.format(
"tag", max_tag_len, "n_calls", "mean_ms",
"n_calls_per_ts", "mean_ms_per_ts"))
writer.write(
"{:-<{}s} {:-<7s} {:-<14s} {:-<14s} {:-<14s}\n"
.format(
"", max_tag_len, "", "", "", ""))
for tag in profile_data.tags:
writer.write(
"{: <{}s} {: >7d} {: >14.6f} {: >14.6f} "
"{: >14.6f}\n"
.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, run_time_ms,
machine_time_step_ms),
profile_data.get_mean_ms_per_ts(
tag, run_time_ms,
machine_time_step_ms)))