Source code for spinn_front_end_common.interface.interface_functions.insert_extra_monitor_vertices_to_graphs
# Copyright (c) 2017-2019 The University of Manchester
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from spinn_utilities.progress_bar import ProgressBar
from pacman.model.constraints.placer_constraints import ChipAndCoreConstraint
from pacman.model.graphs.common import Slice
from spinn_front_end_common.utility_models import (
DataSpeedUpPacketGather, DataSpeedUpPacketGatherMachineVertex,
ExtraMonitorSupport, ExtraMonitorSupportMachineVertex)
[docs]class InsertExtraMonitorVerticesToGraphs(object):
""" Inserts the extra monitor vertices into the graph that correspond to\
the extra monitor cores required.
"""
def __call__(
self, machine, machine_graph, default_report_directory,
write_data_speed_up_reports, n_cores_to_allocate=1,
graph_mapper=None, application_graph=None):
"""
:param machine: spinnMachine instance
:param machine_graph: machine graph
:param n_cores_to_allocate: n cores to allocate for reception
:param default_report_directory: the directory where reports go
:param write_data_speed_up_out_report: \
determine whether to write the report for data speed up out
:param write_data_speed_up_in_report: \
determine whether to write the report for data speed up in
:param graph_mapper: graph mapper
:param application_graph: app graph.
:return: vertex to Ethernet connection map, \
list of extra_monitor_vertices, \
vertex_to_chip_map
"""
# pylint: disable=too-many-arguments
progress = ProgressBar(
machine.n_chips + len(list(machine.ethernet_connected_chips)),
"Inserting extra monitors into graphs")
vertex_to_ethernet_connected_chip_mapping = dict()
vertex_to_chip_map = dict()
# handle re injector and chip based data extractor functionality.
extra_monitor_vertices = self._handle_second_monitor_functionality(
progress, machine, application_graph, machine_graph, graph_mapper,
vertex_to_chip_map)
# progress data receiver for data extraction functionality
self._handle_data_extraction_vertices(
progress, machine, application_graph, machine_graph, graph_mapper,
vertex_to_ethernet_connected_chip_mapping, vertex_to_chip_map,
default_report_directory, write_data_speed_up_reports)
return (vertex_to_ethernet_connected_chip_mapping,
extra_monitor_vertices, vertex_to_chip_map)
def _handle_second_monitor_functionality(
self, progress, machine, application_graph, machine_graph,
graph_mapper, vertex_to_chip_map):
""" Handles placing the second monitor vertex with extra functionality\
into the graph
:param progress: progress bar
:param machine: spinnMachine instance
:param application_graph: app graph
:param machine_graph: machine graph
:param graph_mapper: graph mapper
:param vertex_to_chip_map: map between vertex and chip
:return: list of extra monitor vertices
:rtype: list(MachineVertex)
"""
# pylint: disable=too-many-arguments
extra_monitor_vertices = list()
for chip in progress.over(machine.chips, finish_at_end=False):
if not chip.virtual:
# add to machine graph
machine_vertex = self.__new_mach_monitor(chip)
machine_graph.add_vertex(machine_vertex)
vertex_to_chip_map[chip.x, chip.y] = machine_vertex
extra_monitor_vertices.append(machine_vertex)
# add application graph as needed
if application_graph is not None:
app_vertex = self.__new_app_monitor(chip)
application_graph.add_vertex(app_vertex)
graph_mapper.add_vertex_mapping(
machine_vertex, Slice(0, 0), app_vertex)
return extra_monitor_vertices
def _handle_data_extraction_vertices(
self, progress, machine, application_graph, machine_graph,
graph_mapper, vertex_to_ethernet_connected_chip_mapping,
vertex_to_chip_map, default_report_directory,
write_data_speed_up_reports):
""" Places vertices for receiving data extraction packets.
:param progress: progress bar
:param machine: machine instance
:param application_graph: application graph
:param machine_graph: machine graph
:param default_report_directory: \
the default directory for where reports are to be written
:param write_data_speed_up_reports: \
determine whether to write the reports for data speed up
:param graph_mapper: graph mapper
:param vertex_to_ethernet_connected_chip_mapping: vertex to chip map
:param vertex_to_chip_map: map between chip and extra monitor
:rtype: None
"""
# pylint: disable=too-many-arguments
# insert machine vertices
for ethernet_chip in progress.over(machine.ethernet_connected_chips):
# add to application graph if possible
if application_graph is not None:
app_vertex = self.__new_app_gatherer(
ethernet_chip, vertex_to_chip_map,
default_report_directory, write_data_speed_up_reports)
machine_vertex = app_vertex.machine_vertex
machine_graph.add_vertex(machine_vertex)
application_graph.add_vertex(app_vertex)
graph_mapper.add_vertex_mapping(
machine_vertex, Slice(0, 0), app_vertex)
else:
machine_vertex = self.__new_mach_gatherer(
ethernet_chip, vertex_to_chip_map,
default_report_directory, write_data_speed_up_reports)
machine_graph.add_vertex(machine_vertex)
# update mapping for edge builder
vertex_to_ethernet_connected_chip_mapping[
ethernet_chip.x, ethernet_chip.y] = machine_vertex
@staticmethod
def __new_app_monitor(chip):
return ExtraMonitorSupport(constraints=[
ChipAndCoreConstraint(x=chip.x, y=chip.y)])
@staticmethod
def __new_mach_monitor(chip):
return ExtraMonitorSupportMachineVertex(constraints=[
ChipAndCoreConstraint(x=chip.x, y=chip.y)])
@staticmethod
def __new_app_gatherer(
ethernet_chip, vertex_to_chip_map, default_report_directory,
write_data_speed_up_reports):
return DataSpeedUpPacketGather(
x=ethernet_chip.x, y=ethernet_chip.y,
ip_address=ethernet_chip.ip_address,
constraints=[ChipAndCoreConstraint(
x=ethernet_chip.x, y=ethernet_chip.y)],
extra_monitors_by_chip=vertex_to_chip_map,
report_default_directory=default_report_directory,
write_data_speed_up_reports=write_data_speed_up_reports)
@staticmethod
def __new_mach_gatherer(
ethernet_chip, vertex_to_chip_map, default_report_directory,
write_data_speed_up_reports):
return DataSpeedUpPacketGatherMachineVertex(
x=ethernet_chip.x, y=ethernet_chip.y,
ip_address=ethernet_chip.ip_address,
constraints=[ChipAndCoreConstraint(
x=ethernet_chip.x, y=ethernet_chip.y)],
extra_monitors_by_chip=vertex_to_chip_map,
report_default_directory=default_report_directory,
write_data_speed_up_reports=write_data_speed_up_reports)