From 9c73d7286a00d4e9e11d116318e5ff83cddb7ac1 Mon Sep 17 00:00:00 2001 From: Andrew Mundy Date: Tue, 1 Nov 2016 10:54:33 +0000 Subject: [PATCH] Use a queue to speed up packet processing --- nengo_spinnaker/binaries/nengo_ensemble.aplx | Bin 24512 -> 25136 bytes .../binaries/nengo_ensemble_profiled.aplx | Bin 25896 -> 26520 bytes spinnaker_components/ensemble/ensemble.c | 76 +++++++++++++++ spinnaker_components/ensemble/packet_queue.h | 88 ++++++++++++++++++ 4 files changed, 164 insertions(+) create mode 100644 spinnaker_components/ensemble/packet_queue.h diff --git a/nengo_spinnaker/binaries/nengo_ensemble.aplx b/nengo_spinnaker/binaries/nengo_ensemble.aplx index 731ce2b735a4fbcd5aafa7db0ccaa738900de62d..bc347d8e002006f4ab3307cf09c5f1e34de2c85f 100644 GIT binary patch delta 5683 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 U?Bw=5v8sfX?l|0P+EJtWKYG*2jQ{`u delta 5260 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 PHT)0NPkG*|ZjSh00*So7 delta 5241 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 E3-BWLJOBUy diff --git a/spinnaker_components/ensemble/ensemble.c b/spinnaker_components/ensemble/ensemble.c index 90e4f45..1c7db4a 100644 --- a/spinnaker_components/ensemble/ensemble.c +++ b/spinnaker_components/ensemble/ensemble.c @@ -19,10 +19,14 @@ #include "pes.h" #include "recording.h" #include "voja.h" +#include "packet_queue.h" /*****************************************************************************/ // Global variables ensemble_state_t ensemble; // Global state +packet_queue_t packets; // Queue of multicast packets +bool queue_processing; // Flag indicating that packets are being processed +unsigned int queue_overflows; // Input filters and buffers for general and inhibitory inputs. Their outputs // are summed into accumulators which are used to drive the standard neural input @@ -368,6 +372,21 @@ static inline void decode_output_and_transmit(const ensemble_state_t *ensemble) // Multicast packet with payload received void mcpl_received(uint key, uint payload) { + // Queue the packet for later processing, if no processing is scheduled then + // trigger the queue processor. + if (packet_queue_push(&packets, key, payload)) + { + if (!queue_processing) + { + spin1_trigger_user_event(0, 0); + queue_processing = true; + } + } + else + { + queue_overflows++; + } + /* // Try to receive the packet in each filter uint32_t offset = ensemble.parameters.input_subspace.offset; uint32_t max_dim_sub_one = ensemble.parameters.input_subspace.n_dims - 1; @@ -376,6 +395,50 @@ void mcpl_received(uint key, uint payload) offset, max_dim_sub_one ); input_filtering_input(&filter_routing_unsliced_inputs, key, payload); + */ +} + +void process_queue() +{ + uint32_t offset = ensemble.parameters.input_subspace.offset; + uint32_t max_dim_sub_one = ensemble.parameters.input_subspace.n_dims - 1; + + // Continuously remove packets from the queue and including them in filters + while (!packet_queue_is_empty(&packets)) + { + // Pop a packet from the queue (critical section) + packet_t packet; + uint cpsr = spin1_fiq_disable(); + bool packet_is_valid = packet_queue_pop(&packets, &packet); + spin1_mode_restore(cpsr); + + // Process the received packet + if (packet_is_valid) + { + uint32_t key = packet.key; + uint32_t payload = packet.payload; + + input_filtering_input_with_dimension_offset( + &filter_routing_sliced_inputs, key, payload, + offset, max_dim_sub_one + ); + input_filtering_input(&filter_routing_unsliced_inputs, key, payload); + } + else + { + io_printf(IO_BUF, "Popped packet from empty queue\n"); + rt_error(RTE_ABORT); + } + } + queue_processing = false; +} + +void user_event(uint arg0, uint arg1) +{ + use(arg0); + use(arg1); + + process_queue(); } /*****************************************************************************/ @@ -517,6 +580,8 @@ void timer_tick(uint ticks, uint arg1) // Apply filtering to the input vector profiler_write_entry(PROFILER_ENTER | PROFILER_INPUT_FILTER); + process_queue(); + input_filtering_step(&input_filters); input_filtering_step(&inhibition_filters); input_filtering_step_no_accumulate(&modulatory_filters); @@ -784,12 +849,17 @@ void c_main(void) // -------------------------------------------------------------------------- + queue_processing = false; + packet_queue_init(&packets, 1024); + queue_overflows = 0; + // -------------------------------------------------------------------------- // Prepare callbacks spin1_set_timer_tick(ensemble.parameters.machine_timestep); spin1_callback_on(TIMER_TICK, timer_tick, 2); spin1_callback_on(DMA_TRANSFER_DONE, dma_complete, 0); spin1_callback_on(MCPL_PACKET_RECEIVED, mcpl_received, -1); + spin1_callback_on(USER_EVENT, user_event, 1); // -------------------------------------------------------------------------- // -------------------------------------------------------------------------- @@ -806,6 +876,12 @@ void c_main(void) record_buffer_reset(&record_spikes); record_buffer_reset(&record_voltages); + if (queue_overflows) + { + io_printf(IO_BUF, "Queue overflows = %u\n", queue_overflows); + rt_error(RTE_ABORT); + } + // Perform the simulation spin1_start(SYNC_WAIT); } diff --git a/spinnaker_components/ensemble/packet_queue.h b/spinnaker_components/ensemble/packet_queue.h new file mode 100644 index 0000000..6a417dd --- /dev/null +++ b/spinnaker_components/ensemble/packet_queue.h @@ -0,0 +1,88 @@ +/* Methods and structures required to handle a queue of packets. + */ + +#ifndef __PACKET_QUEUE_H__ +#define __PACKET_QUEUE_H__ + +#include +#include +#include "nengo-common.h" + +typedef struct +{ + uint32_t key; + uint32_t payload; +} packet_t; + +// Packet queue structure (really a stack) +typedef struct +{ + packet_t *packets; // The queue + unsigned int length; // Length of the queue + unsigned int current; // Current position in the queue +} packet_queue_t; + + +// Create an initialise a packet queue +static inline void packet_queue_init(packet_queue_t *queue, + unsigned int length) +{ + // Allocate space for the queue + MALLOC_OR_DIE(queue->packets, length * sizeof(packet_t)); + + // Store the length and current position + queue->length = length; + queue->current = 0; +} + + +// Add a packet to the queue +static inline bool packet_queue_push(packet_queue_t *queue, + uint32_t key, uint32_t payload) +{ + if (queue->current < queue->length) + { + // Add the packet to the queue if it isn't full + queue->packets[queue->current].key = key; + queue->packets[queue->current].payload = payload; + queue->current++; + return true; + } + else + { + // Otherwise return false to indicate that the queue was full + return false; + } +} + + +// Pop a packet from the queue, returning true or false to indicate whether +// this succeeded. +static inline bool packet_queue_pop(packet_queue_t *queue, + packet_t *dest) +{ + if (queue->current > 0) + { + // Decrement the current index and then copy the key and payload to the + // destination. + queue->current--; + dest->key = queue->packets[queue->current].key; + dest->payload = queue->packets[queue->current].payload; + + return true; // Indicate that a packet was popped + } + else + { + // Otherwise return false to indicate that the queue was empty + return false; + } +} + + +// Query if a queue is empty +static inline bool packet_queue_is_empty(packet_queue_t *queue) +{ + return queue->current > 0; +} + +#endif // __PACKET_QUEUE_H__