Exemplo n.º 1
0
    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()
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
    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()
Exemplo n.º 5
0
    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()
Exemplo n.º 6
0
    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()
Exemplo n.º 7
0
    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()
Exemplo n.º 8
0
    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()
Exemplo n.º 10
0
    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()