Skip to main content
欢迎来到PAWPAW技术文档网站了解更多信息

在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 函数。