Source code for spinn_front_end_common.interface.profiling.profile_utils
from spinn_front_end_common.interface.profiling.profile_data \
import ProfileData
import logging
import struct
from spinn_front_end_common.utilities import helpful_functions
logger = logging.getLogger(__name__)
PROFILE_HEADER_SIZE_BYTES = 4
SIZE_OF_PROFILE_DATA_ENTRY_IN_BYTES = 8
BYTE_OFFSET_OF_PROFILE_DATA_IN_PROFILE_REGION = 4
[docs]def get_profile_region_size(n_samples):
""" Get the size of the region of the profile data
:param n_samples: number of different samples to record
:return the size in bytes used by the profile region
"""
return PROFILE_HEADER_SIZE_BYTES + (
n_samples * SIZE_OF_PROFILE_DATA_ENTRY_IN_BYTES)
[docs]def reserve_profile_region(spec, region, n_samples):
""" Reserves the profile region for recording the profile data
:param spec: the dsg specification writer
:param region: region id for the profile data
:param n_samples: n elements being sampled
:rtype: None
"""
size = get_profile_region_size(n_samples)
spec.reserve_memory_region(
region=region, size=size, label="profilerRegion")
[docs]def write_profile_region_data(spec, region, n_samples):
""" Writes the profile region data
:param spec: the dsg specification writer
:param region: region id for the profile data
:param n_samples: n elements being sampled
:rtype: None
"""
spec.switch_write_focus(region)
spec.write_value(n_samples)
[docs]def get_profiling_data(profile_region, tag_labels, txrx, placement):
""" Utility function to get profile data from a profile region
:param profile_region: dsg region to get profiling data out of sdram
:param tag_labels: labels for the profiling data
:param txrx: transceiver code
:param placement: placement
:return: ProfileData
"""
profile_data = ProfileData(tag_labels)
profiling_region_base_address = \
helpful_functions.locate_memory_region_for_placement(
placement=placement, region=profile_region, transceiver=txrx)
# Read the profiling data size
words_written_data =\
buffer(txrx.read_memory(
placement.x, placement.y,
profiling_region_base_address, 4))
words_written = \
struct.unpack_from("<I", words_written_data)[0]
# Read the profiling data
if words_written != 0:
profiling_data = txrx.read_memory(
placement.x, placement.y,
profiling_region_base_address +
BYTE_OFFSET_OF_PROFILE_DATA_IN_PROFILE_REGION,
words_written * 4)
profile_data.add_data(profiling_data)
return profile_data