Source code for spinn_front_end_common.interface.profiling.profile_utils

# Copyright (c) 2016 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.
from typing import Mapping

from pacman.model.placements import Placement

from spinn_front_end_common.utilities.helpful_functions import (
    locate_memory_region_for_placement)
from spinn_front_end_common.utilities.constants import BYTES_PER_WORD
from spinn_front_end_common.data import FecDataView
from spinn_front_end_common.interface.ds import DataSpecificationGenerator

from .profile_data import ProfileData

_PROFILE_HEADER_SIZE_BYTES = BYTES_PER_WORD
_SIZE_OF_PROFILE_DATA_ENTRY_IN_BYTES = 2 * BYTES_PER_WORD
_BYTE_OFFSET_OF_PROFILE_DATA_IN_PROFILE_REGION = BYTES_PER_WORD


[docs] def get_profile_region_size(n_samples: int) -> int: """ Get the size of the region of the profile data. :param int n_samples: number of different samples to record :return: the size in bytes used by the profile region :rtype: int """ return _PROFILE_HEADER_SIZE_BYTES + ( n_samples * _SIZE_OF_PROFILE_DATA_ENTRY_IN_BYTES)
[docs] def reserve_profile_region( spec: DataSpecificationGenerator, region: int, n_samples: int): """ Reserves the profile region for recording the profile data. :param ~data_specification.DataSpecificationGenerator spec: the DSG specification writer :param int region: region ID for the profile data :param int n_samples: number of elements being sampled """ size = get_profile_region_size(n_samples) spec.reserve_memory_region( region=region, size=size, label="profilerRegion")
[docs] def write_profile_region_data( spec: DataSpecificationGenerator, region: int, n_samples: int): """ Writes the profile region data. :param ~data_specification.DataSpecificationGenerator spec: the DSG specification writer :param int region: region ID for the profile data :param int n_samples: number of elements being sampled """ spec.switch_write_focus(region) spec.write_value(n_samples)
[docs] def get_profiling_data( profile_region: int, tag_labels: Mapping[int, str], placement: Placement) -> ProfileData: """ Utility function to get profile data from a profile region. :param int profile_region: DSG region to get profiling data out of SDRAM :param list(str) tag_labels: labels for the profiling data :param ~pacman.model.placements.Placement placement: placement :rtype: ProfileData """ txrx = FecDataView.get_transceiver() profile_data = ProfileData(tag_labels) address = locate_memory_region_for_placement( placement=placement, region=profile_region) # Read the profiling data size words_written = txrx.read_word(placement.x, placement.y, address) # Read the profiling data if words_written != 0: address += _BYTE_OFFSET_OF_PROFILE_DATA_IN_PROFILE_REGION profile_data.add_data(txrx.read_memory( placement.x, placement.y, address, words_written * BYTES_PER_WORD)) return profile_data