如果主机仅安装有一张加速器卡,那么 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]);
}