Communicating between tiles¶
Usually application code running on separate tiles will need to communicate and synchronise their activity. Such communication is passed via internal interconnect and between devices using xLINKs. See xCONNECT architecture. A top-level multi-tile XC file can also declare channels between the tiles it places entry-points on.
Declaring a channel in the multi-tile file¶
The XK-EVK-XU316 has two tiles and interconnect for
communication between the tiles within the package. The tools will
automatically configure a channel via the interconnect using multitile.xc
as below:
#include <platform.h>
typedef chanend chanend_t;
extern "C" {
void main_tile0(chanend_t);
void main_tile1(chanend_t);
}
int main(void)
{
chan c;
par {
on tile[0]: main_tile0(c);
on tile[1]: main_tile1(c);
}
return 0;
}
In this example, the tile level entrypoint functions each accept a chanend. In
the forward-declarations these functions take a chanend
argument; this is
compatible with a lib_xcore chanend_t
at link-time. The chan
keyword is
used in main
to declare a channel. When a channel is passed to tile-level
main, an end is automatically assigned to each entrypoint which uses it. In the
task-level entrypoints, these chanends are used just like local ones.
Using the channel¶
In the tile-level entrypoints, the chanends are used as per
Programming an XCORE tile with C and lib_xcore. This time in
main.c
, we have a more interesting pair of tile functions. Each is
passed a chanend_t c
, and they use it to communicate between tiles and
synchronise their activities.
#include <stdio.h>
#include <xcore/channel.h>
#define ITERATIONS 10
void main_tile0(chanend_t c)
{
int result = 0;
printf("Tile 0: Result %d\n", result);
chan_out_word(c, ITERATIONS);
result = chan_in_word(c);
printf("Tile 0: Result %d\n", result);
}
void main_tile1(chanend_t c)
{
int iterations = chan_in_word(c);
int accumulation = 0;
for (int i = 0; i < iterations; i++)
{
accumulation += i;
printf("Tile 1: Iteration %d Accumulation: %d\n", i, accumulation);
}
chan_out_word(c, accumulation);
}
Building and executing this multi-tile application produces the expected result:
$ xcc -target=XK-EVK-XU316 multitile.xc main.c
$ xrun --io a.xe
Tile 0: Result 0
Tile 1: Iteration 0 Accumulation: 0
Tile 1: Iteration 1 Accumulation: 1
Tile 1: Iteration 2 Accumulation: 3
Tile 1: Iteration 3 Accumulation: 6
Tile 1: Iteration 4 Accumulation: 10
Tile 1: Iteration 5 Accumulation: 15
Tile 1: Iteration 6 Accumulation: 21
Tile 1: Iteration 7 Accumulation: 28
Tile 1: Iteration 8 Accumulation: 36
Tile 1: Iteration 9 Accumulation: 45
Tile 0: Result 45
Summary¶
You have now written a multi-tile application which, through the declarations in multitile.xc, sets up a channel between the tiles and provides pre-allocated chanends of for each end of this channel to the C functions.