在tile之间通信
通常,在不同的tile上运行的应用程序代码需要进行通信和同步。这种通信是通过内部互连以及使用XLINKS在设备之间传递的。请参阅xCONNECT架构。一个顶层的多芯片XC文件也可以在它放置入口点的芯片之间声明通道。
在多tile文件中声明一个通道
XU316-1024-QF60B-C24有两个tile,以及用于在芯片封装内部的tile之间互连通信。XTC工具会自动使用multitile.xc文件来通过互连配置一个通道,如下所示:
multitile.xc
#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;
}
在这个例子中,每个tile级入口函数都接受一个 chanend。在前向声明中,这些函数都有一个 chanend 参数;这与链接时的 lib_xcore chanend_t 兼容。在 main 中使用 chan 关键字来声明一个通道。当一个通道被传递给tile级的 main 时,一个端点会自动分配给每个使用它的入口点。在任务级的入口点中,这些 chanend 可以像本地参数一样使用。
使用通道
在tile级入口点中,chanend 按照 使用 C 和 lib_xcore 编程 XCore tile 的方式使用。这次在 main.c 中,我们有一对更有趣的tile函数。每个函数都被传递了一个chanend_t c,它们用它来在tile之间进行通信和同步它们的活动。
main.c
#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);
}
构建和执行这个多tile应用程序产生了预期的结果:
$ xcc -target=XU316-1024-QF60B-C24 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
总结
你现在已经编写了一个多tile应用程序,它通过 multitile.xc 中的声明,在tile之间建立了一个通道,并为这个通道的每一端提供了预分配的 chanend 给 C 函数。