API Documentation
Simple message passing buffers support¶
-
group
mpsimple
The simple message passing buffer (mpbuffer) is a hardware device that can be used to communicate among compute tiles. They are useful to build efficient or optimized message passing applications, but in most cases the message passing library is recommended as it first encapsulates the actual message passing protocol (end-to-end flow control control etc.), and second uses the available hardware accelerators which are more performant than the message passing buffers.
The message passing buffers are hardware FIFOs and the software directly writes and reads network packets into the FIFOs. There are multiple endpoints to mitigate message-dependent deadlocks. Your software can query the number of available endpoints with optimsoc_mp_simple_num_endpoints().
Software can send a packet on an endpoint using optimsoc_mp_simple_send(). To receive incoming packets, the software registers a handler for incoming messages using optimsoc_mp_simple_addhandler(). Messages from all endpoints invoke the handler, but you can register different handlers for different message classes.
- Note
Be careful with selecting classes, because they may be occupied by other hardware. If you are not sure, use class 0.
Functions
-
void
optimsoc_mp_simple_init
(void)¶ Initialize simple message passing buffers
-
uint16_t
optimsoc_mp_simple_num_endpoints
(void)¶ Query the number of endpoints.
- Return
Number of endpoints
-
void
optimsoc_mp_simple_enable
(uint16_t endpoint)¶ Enable the endpoint to receive packets
The hardware will only be able to receive packets after it was enabled. Hence you need to check the endpoint from the remote using optimsoc_mp_simple_enable() before calling optimsoc_mp_simple_send().
- Parameters
endpoint
: Endpoint buffer to enable
-
int
optimsoc_mp_simple_ctready
(uint32_t rank, uint16_t endpoint)¶ Check if an endpoint at another compute tile is ready
This function must be called before calling optimsoc_mp_simple_send(). The function is non-blocking, meaning that with the first call it will always return 0. It sends a message to the remote to check the state. Further calls will then return immediately if a successfull response was received, otherwise try again.
The receiver must enable the endpoint using optimsoc_mp_simple_enable().
- Return
Endpoint status (0: not ready, 1: enabled)
- Parameters
rank
: Compute tile rank to checkendpoint
: Endpoint buffer to check
-
void
optimsoc_mp_simple_send
(uint16_t endpoint, size_t size, uint32_t *buf)¶ Send a message
Sends a message of size from buf.
- Parameters
endpoint
: The endpoint to send the message onsize
: Size of the message in (word-sized) flitsbuf
: Message buffer containint size flits
-
void
optimsoc_mp_simple_addhandler
(uint8_t cls, void (*hnd)(uint32_t*, size_t))¶ Add a handler for a class of incoming messages
A message header contains a class. This class field can be used to mix different kinds of message services. For each class you are using in your system you need to add a class handler. As there is no default class handler all remaining classes are dropped.
- Parameters
cls
: Class to registerhnd
: Function pointer to handler for this class