ホスト マシンにアクセラレータ カードが 1 つしかない場合、VSC はそのカードを使用しようとします。カードがデザインをコンパイルしたプラットフォームに適合しない場合、致命的エラーが発生します。ただし、複数のカードがインストールされているホスト マシンでは、VSC はデフォルトで、デザインがコンパイルされたプラットフォームに正確に一致する最初のカードを選択します。ホスト コードは、次の 2 つの方法でデフォルトを上書きできます。
-
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 が、次に説明するように、別の計算クラスターとして実行されているモードでサポートされます。
別の計算クラスター モードは、ローカルの smartSSD を搭載した U2 カードなどのシナリオでパフォーマンスを向上させるのに役立ちます。次のコード例では、CU クラスターを作成し、各クラスターにカードを割り当てます。その後、インデックス i に基づいてデータ選択を実行できます。選択したデータ i は同じ SSD 上にあるため、後続の compute()
ジョブで自動的にカード i が使用されるようにします。
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]);
}