def __get_neuron_resources(self, vertex_slice): """ Gets the resources of the neurons of a slice of atoms from a given app vertex. :param ~pacman.model.graphs.common.Slice vertex_slice: the slice :rtype: ~pacman.model.resources.ResourceContainer """ n_record = len(self._governed_app_vertex.neuron_recordables) variable_sdram = self._governed_app_vertex.get_neuron_variable_sdram( vertex_slice) sdram = MultiRegionSDRAM() sdram.merge(self._governed_app_vertex.get_common_constant_sdram( n_record, NeuronProvenance.N_ITEMS + NeuronMainProvenance.N_ITEMS, PopulationNeuronsMachineVertex.COMMON_REGIONS)) sdram.merge(self._governed_app_vertex.get_neuron_constant_sdram( vertex_slice, PopulationNeuronsMachineVertex.NEURON_REGIONS)) sdram.add_cost( PopulationNeuronsMachineVertex.REGIONS.SDRAM_EDGE_PARAMS.value, NEURONS_SDRAM_PARAMS_SIZE) sdram.nest( len(PopulationNeuronsMachineVertex.REGIONS) + 1, variable_sdram) dtcm = self._governed_app_vertex.get_common_dtcm() dtcm += self._governed_app_vertex.get_neuron_dtcm(vertex_slice) cpu_cycles = self._governed_app_vertex.get_common_cpu() cpu_cycles += self._governed_app_vertex.get_neuron_cpu(vertex_slice) # set resources required from this object container = ResourceContainer( sdram=sdram, dtcm=DTCMResource(dtcm), cpu_cycles=CPUCyclesPerTickResource(cpu_cycles)) # return the total resources. return container
def test_sdram(self): """ test that adding a SDRAM resource to a resource container works correctly """ const1 = ConstantSDRAM(128) self.assertEqual(const1.get_total_sdram(None), 128) const2 = ConstantSDRAM(256) combo = const1 + const2 self.assertEqual(combo.get_total_sdram(None), 128 + 256) combo = const1 - const2 self.assertEqual(combo.get_total_sdram(None), 128 - 256) combo = const2 + const1 self.assertEqual(combo.get_total_sdram(None), 256 + 128) combo = const2 - const1 self.assertEqual(combo.get_total_sdram(None), 256 - 128) var1 = VariableSDRAM(124, 8) self.assertEqual(var1.get_total_sdram(100), 124 + 8 * 100) combo = var1 + const1 self.assertEqual(combo.get_total_sdram(100), 124 + 8 * 100 + 128) combo = var1 - const1 self.assertEqual(combo.get_total_sdram(100), 124 + 8 * 100 - 128) combo = const1 + var1 self.assertEqual(combo.get_total_sdram(100), 128 + 124 + 8 * 100) combo = const1 - var1 self.assertEqual(combo.get_total_sdram(100), 128 - (124 + 8 * 100)) var2 = VariableSDRAM(234, 6) combo = var2 + var1 self.assertEqual(combo.get_total_sdram(150), 234 + 124 + (6 + 8) * 150) combo = var2 - var1 self.assertEqual(combo.get_total_sdram(150), 234 - 124 + (6 - 8) * 150) multi1 = MultiRegionSDRAM() multi1.add_cost(1, 100, 4) multi1.add_cost(2, 50, 3) multi1.add_cost("overheads", 20) multi2 = MultiRegionSDRAM() multi2.add_cost(MockEnum.ZERO, 88) multi2.add_cost(MockEnum.ONE, 72) multi2.add_cost("overheads", 22) combo = multi1 + multi2 self.assertEqual(combo.get_total_sdram(150), 100 + 50 + 20 + 88 + 72 + 22 + (4 + 3) * 150) multi3 = MultiRegionSDRAM() multi3.nest("foo", multi1) multi3.nest("bar", multi2) multi1.merge(multi2) self.assertEqual(len(multi1.regions), 5) self.assertEqual(multi1.regions["overheads"], ConstantSDRAM(20 + 22)) self.assertEqual(multi1.get_total_sdram(150), 100 + 50 + 20 + 88 + 72 + 22 + (4 + 3) * 150) self.assertEqual(multi1, combo) self.assertEqual(multi1, multi3) with tempfile.TemporaryFile(mode="w") as target: multi3.report(1000, target=target)
def __get_synapse_resources(self, vertex_slice, shared_sdram=None): """ Get the resources of the synapses of a slice of atoms from a given app vertex. :param ~pacman.model.graphs.common.Slice vertex_slice: the slice :param ~pacman.model.resources.MultiRegionSDRAM shared_sdram: The SDRAM shared between cores, if this is to be included :rtype: ~pacman.model.resources.ResourceContainer """ n_record = len(self._governed_app_vertex.synapse_recordables) variable_sdram = self._governed_app_vertex.get_synapse_variable_sdram( vertex_slice) sdram = MultiRegionSDRAM() sdram.merge( self._governed_app_vertex.get_common_constant_sdram( n_record, SynapseProvenance.N_ITEMS + SpikeProcessingFastProvenance.N_ITEMS, PopulationSynapsesMachineVertexLead.COMMON_REGIONS)) sdram.add_cost( PopulationSynapsesMachineVertexLead.REGIONS.SDRAM_EDGE_PARAMS. value, SYNAPSES_SDRAM_PARAMS_SIZE) sdram.add_cost( PopulationSynapsesMachineVertexLead.REGIONS.KEY_REGION.value, KEY_CONFIG_SIZE) sdram.nest( len(PopulationSynapsesMachineVertexLead.REGIONS) + 1, variable_sdram) if shared_sdram is not None: sdram.merge(shared_sdram) dtcm = self._governed_app_vertex.get_common_dtcm() dtcm += self._governed_app_vertex.get_synapse_dtcm(vertex_slice) cpu_cycles = self._governed_app_vertex.get_common_cpu() cpu_cycles += self._governed_app_vertex.get_synapse_cpu(vertex_slice) # set resources required from this object container = ResourceContainer( sdram=sdram, dtcm=DTCMResource(dtcm), cpu_cycles=CPUCyclesPerTickResource(cpu_cycles)) # return the total resources. return container
def get_resources_used_by_atoms(self, vertex_slice): """ Gets the resources of a slice of atoms :param ~pacman.model.graphs.common.Slice vertex_slice: the slice :rtype: ~pacman.model.resources.ResourceContainer """ # pylint: disable=arguments-differ variable_sdram = self.__get_variable_sdram(vertex_slice) constant_sdram = self.__get_constant_sdram(vertex_slice) sdram = MultiRegionSDRAM() sdram.nest(len(PopulationMachineVertex.REGIONS) + 1, variable_sdram) sdram.merge(constant_sdram) # set resources required from this object container = ResourceContainer( sdram=sdram, dtcm=self.__get_dtcm_cost(vertex_slice), cpu_cycles=self.__get_cpu_cost(vertex_slice)) # return the total resources. return container