def generate_machine_data_specification(self, spec, placement, machine_graph, routing_info, iptags, reverse_iptags, machine_time_step, time_scale_factor): """ Generate data :param placement: the placement object for the DSG :param machine_graph: the graph object for this DSG :param routing_info: the routing info object for this DSG :param iptags: the collection of IP tags generated by the tag allocator :param reverse_iptags: the collection of reverse IP tags generated by\ the tag allocator """ # Note the placement now that we know it! self.placement = placement # Generate the system data region for simulation .c requirements generate_system_data_region(spec, self.DATA_REGIONS.SYSTEM.value, self, machine_time_step, time_scale_factor) # Generate the application data regions self._reserve_app_memory_regions(spec) self._write_app_memory_regions(spec, routing_info, iptags) # End-of-Spec: spec.end_specification()
def generate_machine_data_specification(self, spec, placement, machine_graph, routing_info, iptags, reverse_iptags, machine_time_step, time_scale_factor): # Generate the system data region for simulation .c requirements generate_system_data_region(spec, self.DATA_REGIONS.SYSTEM.value, self, machine_time_step, time_scale_factor) self.placement = placement # Reserve SDRAM space for memory areas: # Create the data regions for hello world self._reserve_memory_regions(spec) # write data for the simulation data item spec.switch_write_focus(self.DATA_REGIONS.STRING_DATA.value) spec.write_array( recording_utilities.get_recording_header_array( [self._string_data_size], self._time_between_requests, self._string_data_size + 256, iptags)) # End-of-Spec: spec.end_specification()
def generate_system_region(self, spec, region_id=0): """ Generate the system region for the data specification. Assumes that the vertex uses the system timestep and time scale factor. .. note:: Do not use this with untimed vertices. :param ~data_specification.DataSpecificationGenerator spec: The data specification being built :param int region_id: Which region is the system region. Defaults to 0 because it is almost always the first one. """ generate_system_data_region(spec, region_id, self)
def generate_machine_data_specification(self, spec, placement, machine_graph, routing_info, iptags, reverse_iptags, machine_time_step, time_scale_factor): # Generate the system data region for simulation.c requirements generate_system_data_region(spec, self.SDRAM_REGIONS.SYSTEM.value, self, machine_time_step, time_scale_factor) # reserve and write the core configuration region spec.reserve_memory_region(self.SDRAM_REGIONS.INJECTOR.value, self.CONFIGURATION_BYTES) spec.switch_write_focus(self.SDRAM_REGIONS.INJECTOR.value) # write core configuration into spec for c in self.config: spec.write_value(c, data_type=DataType.UINT8) # reserve and write the routing keys region spec.reserve_memory_region(self.SDRAM_REGIONS.ROUTING.value, self.ROUTING_BYTES) spec.switch_write_focus(self.SDRAM_REGIONS.ROUTING.value) # write number of routing keys spec.write_value(self.NKEYS, data_type=DataType.UINT32) # write routing keys if self.NKEYS == 1: spec.write_value(routing_info.get_first_key_from_pre_vertex( self, self.inj_lnk), data_type=DataType.UINT32) else: for k in range(self.NKEYS): spec.write_value(routing_info.get_first_key_from_pre_vertex( self, self.inj_lnk[k]), data_type=DataType.UINT32) spec.end_specification()
def generate_machine_data_specification(self, spec, placement, machine_graph, routing_info, iptags, reverse_iptags, machine_time_step, time_scale_factor): # Generate the system data region for simulation.c requirements generate_system_data_region(spec, self.SDRAM_REGIONS.SYSTEM.value, self, machine_time_step, time_scale_factor) # reserve and write the core configuration region spec.reserve_memory_region(self.SDRAM_REGIONS.EXTRACTOR.value, self.CONFIGURATION_BYTES) spec.switch_write_focus(self.SDRAM_REGIONS.EXTRACTOR.value) # write the core configuration into spec for c in self.config: spec.write_value(c, data_type=DataType.UINT8) spec.end_specification()
def generate_machine_data_specification(self, spec, placement, machine_graph, routing_info, iptags, reverse_iptags, machine_time_step, time_scale_factor): # Generate the system data region for simulation requirements generate_system_data_region(spec, DataRegions.SYSTEM.value, self, machine_time_step, time_scale_factor) self._generate_and_write_base_params(spec, placement, machine_graph, routing_info) self._generate_and_write_keys(spec, routing_info) self._generate_and_write_weights(spec) if self.trainable_params is not None: self._generate_and_write_trainable_regions(spec, machine_graph, routing_info) spec.end_specification()
def generate_machine_data_specification(self, spec, placement, machine_graph, routing_info, iptags, reverse_iptags, machine_time_step, time_scale_factor): # Generate the system data region for simulation .c requirements generate_system_data_region(spec, self.DATA_REGIONS.SYSTEM.value, self, machine_time_step, time_scale_factor) # reserve memory regions spec.reserve_memory_region( region=self.DATA_REGIONS.TRANSMISSIONS.value, size=self.TRANSMISSION_DATA_SIZE, label="inputs") spec.reserve_memory_region(region=self.DATA_REGIONS.STATE.value, size=self.STATE_DATA_SIZE, label="state") spec.reserve_memory_region( region=self.DATA_REGIONS.NEIGHBOUR_INITIAL_STATES.value, size=8, label="neighour_states") spec.reserve_memory_region( region=self.DATA_REGIONS.RESULTS.value, size=recording_utilities.get_recording_header_size(1)) # get recorded buffered regions sorted spec.switch_write_focus(self.DATA_REGIONS.RESULTS.value) spec.write_array( recording_utilities.get_recording_header_array( [MAX_SIZE_OF_BUFFERED_REGION_ON_CHIP], self._time_between_requests, self._buffer_size_before_receive, iptags)) # check got right number of keys and edges going into me partitions = \ machine_graph.get_outgoing_edge_partitions_starting_at_vertex(self) if not is_single(partitions): raise ConfigurationException( "Can only handle one type of partition.") # check for duplicates edges = list(machine_graph.get_edges_ending_at_vertex(self)) if len(edges) != 8: raise ConfigurationException( "I've not got the right number of connections. I have {} " "instead of 8".format( len(machine_graph.incoming_subedges_from_vertex(self)))) for edge in edges: if edge.pre_vertex == self: raise ConfigurationException( "I'm connected to myself, this is deemed an error" " please fix.") # write key needed to transmit with key = routing_info.get_first_key_from_pre_vertex( self, self.PARTITION_ID) spec.switch_write_focus(region=self.DATA_REGIONS.TRANSMISSIONS.value) spec.write_value(0 if key is None else 1) spec.write_value(0 if key is None else key) # write state value spec.switch_write_focus(region=self.DATA_REGIONS.STATE.value) spec.write_value(int(bool(self._state))) # write neighbours data state spec.switch_write_focus( region=self.DATA_REGIONS.NEIGHBOUR_INITIAL_STATES.value) alive = 0 dead = 0 for edge in edges: if edge.pre_vertex.state: alive += 1 else: dead += 1 spec.write_value(alive) spec.write_value(dead) # End-of-Spec: spec.end_specification()
def generate_machine_data_specification( self, spec, placement, machine_graph, routing_info, iptags, reverse_iptags, machine_time_step, time_scale_factor): # Generate the system data region for simulation requirements generate_system_data_region( spec, DataRegions.SYSTEM.value, self, machine_time_step, time_scale_factor ) spec.reserve_memory_region( region=DataRegions.BASE_PARAMS.value, size=self.PARAMS_DATA_SIZE, label="params" ) spec.reserve_memory_region( region=DataRegions.KEYS.value, size=self.layer.K * BYTES_PER_WORD, label="keys" ) edges = list( machine_graph.get_edges_ending_at_vertex_with_partition_name( self, globals.forward_partition)) # smallest key from previous layer min_pre_key = min([routing_info.get_first_key_from_pre_vertex( edge.pre_vertex, globals.forward_partition) for edge in edges]) edges = list( machine_graph.get_edges_ending_at_vertex_with_partition_name( self, globals.y_partition)) min_y_key = min([routing_info.get_first_key_from_pre_vertex( edge.pre_vertex, globals.y_partition) for edge in edges]) # all the unique partitions to the output layer partitions = \ machine_graph.get_outgoing_edge_partitions_starting_at_vertex(self) keys = [] for partition in partitions: if partition.identifier != globals.backward_partition: keys.append(routing_info.get_first_key_from_pre_vertex( self, partition.identifier)) extractor_key = routing_info.get_first_key_from_pre_vertex( self, globals.backward_partition) spec.switch_write_focus( region=DataRegions.BASE_PARAMS.value) spec.write_value(extractor_key) spec.write_value(globals.losses[self.layer.loss]) spec.write_value(self.layer.K) spec.write_value(min_pre_key) spec.write_value(min_y_key) spec.write_value(generate_offset(placement.p)) spec.write_value(self.trainable_params.epoch_size) spec.switch_write_focus( region=DataRegions.KEYS.value) spec.write_array(keys) spec.end_specification()
def generate_machine_data_specification(self, spec, placement, machine_graph, routing_info, iptags, reverse_iptags, data_n_time_steps): """ :param ~.DataSpecificationGenerator spec: :param ~.MachineGraph machine_graph: :param ~.RoutingInfo routing_info: """ # pylint: disable=arguments-differ # Generate the system data region for simulation .c requirements generate_system_data_region(spec, DataRegions.SYSTEM, self) # reserve memory regions spec.reserve_memory_region(region=DataRegions.TRANSMISSIONS, size=self.TRANSMISSION_DATA_SIZE, label="inputs") spec.reserve_memory_region(region=DataRegions.STATE, size=self.STATE_DATA_SIZE, label="state") spec.reserve_memory_region(region=DataRegions.NEIGHBOUR_INITIAL_STATES, size=self.NEIGHBOUR_INITIAL_STATES_SIZE, label="neighour_states") spec.reserve_memory_region( region=DataRegions.RESULTS, size=(self.RECORDING_HEADER_SIZE + (data_n_time_steps * self.RECORDING_ELEMENT_SIZE)), label="results") # check got right number of keys and edges going into me partitions = machine_graph.\ get_multicast_edge_partitions_starting_at_vertex(self) if not is_single(partitions): raise ConfigurationException( "Can only handle one type of partition.") # check for duplicates edges = list(machine_graph.get_edges_ending_at_vertex(self)) if len(edges) != 8: raise ConfigurationException( "I've not got the right number of connections. I have {} " "instead of 8".format( len(machine_graph.get_edges_ending_at_vertex(self)))) for edge in edges: if edge.pre_vertex == self: raise ConfigurationException( "I'm connected to myself, this is deemed an error " "please fix.") # write key needed to transmit with key = routing_info.get_first_key_from_pre_vertex( self, self.PARTITION_ID) spec.switch_write_focus(DataRegions.TRANSMISSIONS) spec.write_value(int(key is not None)) spec.write_value(0 if key is None else key) # write state value spec.switch_write_focus(DataRegions.STATE) spec.write_value(int(bool(self._state))) # write neighbours data state spec.switch_write_focus(DataRegions.NEIGHBOUR_INITIAL_STATES) alive = sum(edge.pre_vertex.state for edge in edges) dead = sum(not edge.pre_vertex.state for edge in edges) spec.write_value(alive) spec.write_value(dead) # End-of-Spec: spec.end_specification()
def generate_machine_data_specification( self, spec, placement, machine_graph, routing_info, iptags, reverse_iptags, machine_time_step, time_scale_factor, data_n_time_steps): # Generate the system data region for simulation .c requirements generate_system_data_region(spec, self.DATA_REGIONS.SYSTEM.value, self, machine_time_step, time_scale_factor) # reserve memory regions for every data region spec.reserve_memory_region( region=self.DATA_REGIONS.TRANSMISSIONS.value, size=self.TRANSMISSION_DATA_SIZE, label="inputs") spec.reserve_memory_region( region=self.DATA_REGIONS.POSITION.value, size=self.POSITION_DATA_SIZE, label="position" ) spec.reserve_memory_region( region=self.DATA_REGIONS.NEIGHBOUR_KEYS.value, size=self.NEIGHBOUR_KEYS_SIZE ) spec.reserve_memory_region( region=self.DATA_REGIONS.VELOCITY.value, size=self.VELOCITY_SIZE ) spec.reserve_memory_region( region=self.DATA_REGIONS.VERTEX_INDEX.value, size=self.VERTEX_INDEX_SIZE ) spec.reserve_memory_region( region=self.DATA_REGIONS.RESULTS.value, size=recording_utilities.get_recording_header_size(1)) # get recorded buffered regions sorted spec.switch_write_focus(self.DATA_REGIONS.RESULTS.value) spec.write_array(recording_utilities.get_recording_header_array( [self.RECORDING_ELEMENT_SIZE * data_n_time_steps])) # check got right number of keys and edges going into me partitions = \ machine_graph.get_outgoing_edge_partitions_starting_at_vertex(self) if not is_single(partitions): raise ConfigurationException( "Can only handle one type of partition.") # check for duplicates edges = list(machine_graph.get_edges_ending_at_vertex(self)) if len(edges) != 8: raise ConfigurationException( "I've not got the right number of connections. I have {} " "instead of 8".format( len(machine_graph.get_edges_ending_at_vertex(self)))) for edge in edges: if edge.pre_vertex == self: raise ConfigurationException( "I'm connected to myself, this is deemed an error" " please fix.") # write key needed to transmit with key = routing_info.get_first_key_from_pre_vertex( self, self.PARTITION_ID) spec.switch_write_focus( region=self.DATA_REGIONS.TRANSMISSIONS.value) spec.write_value(0 if key is None else 1) spec.write_value(0 if key is None else key) # write POSITION data spec.switch_write_focus( region=self.DATA_REGIONS.POSITION.value ) spec.write_value(int(self._x_position)) spec.write_value(int(self._y_position)) #write VERTEX_INDEX data. Mainly for add a random delay spec.switch_write_focus(region=self.DATA_REGIONS.VERTEX_INDEX.value) spec.write_value(machine_graph.vertices.index(self)) self.offset = generate_offset(placement.p) spec.write_value(self.offset) # write the neighbour keys and masks self._write_key_data(spec, routing_info, machine_graph) #write velocity data in two dimension, x and y spec.switch_write_focus(region=self.DATA_REGIONS.VELOCITY.value) spec.write_value(self.u_x, data_type=DataType.FLOAT_32) spec.write_value(self.u_y, data_type=DataType.FLOAT_32) # End-of-Spec: spec.end_specification()