CU 集群和多卡支持 - 2022.1 简体中文

Vitis 统一软件平台文档 应用加速开发 (UG1393)

Document ID
UG1393
Release Date
2022-05-25
Version
2022.1 简体中文

如果主机仅安装有一张加速器卡,那么 VSC 将尝试使用该卡。如果该卡与设计编译的目标平台不匹配,将发生致命错误。但在安装有多张卡的主机上,VSC 默认将选取与设计编译的目标平台精确匹配的第一张卡。主机代码可通过两种方式来覆盖默认选择:

  • 将环境变量 XILINX_SC_CARD 设置为目标 <cardIndex>
  • 从主机代码中先调用以下 API,然后再执行任何其它调用。
    VPP_ACC call: my_acc::add_card(<cardIndex>)
提示: 安装多张卡的情况下,如果已安装的名称与设计编译的目标平台名称存在任何不匹配,VSC 就将无法识别默认卡。在此类情况下,您必须指定卡索引,如上所示。例如,平台 xilinx_u2_gen3x4_xdma_gc_base_2 与为 xilinx_u2_gen3x4_xdma_gc_2_202110_1 编译的设计不匹配,即使平台兼容也是如此。

正如 受支持的平台和启动示例 中的 sysc_multi_card 示例所示,如果主机安装有多张完全相同的加速器卡,那么您可使用多张卡来运行自己的 VSC 加速器。在任意给定卡的所有 CU 都作为独立计算集群来运行时,支持此操作,如下所述。

独立计算集群模式适用于在诸如 U2 卡具有本地 smartSSD 等情况下改善性能。以下所示代码示例会创建多个 CU 集群,并为每个集群分配一张卡。然后,用户代码即可基于 index-i 来执行数据选择,以确保后续 compute() 作业将自动使用 card-i,因为所选 data-i 驻留在相同 SSD 上。

VPP_CC* cuCluster = new VPP_CC[ncards];
for (int i = 0; i < ncards; ++i) {
    my_acc::add_card(cuCluster[i], i);
}
for (int i = 0; i < ncards; ++i) {
    my_acc::send_while(
        [=]() -> bool {
            ... // data-i selection
        }
        , cuCluster[i]);
    my_acc::receive_all_in_order(
        [=]() {
           ...
       }
       , cuCluster[i]);
}
for (int i = 0; i < ncards; ++i) {
    my_acc::join(cuCluster[i]);
}