新規ターゲット プラットフォームへの移行

このセクションでは、あるターゲット用にアクセラレーションされた SDAccel™ 環境アプリケーションを別のターゲットに移行する方法を説明します。たとえば、アプリケーションを Virtex® UltraScale+™ VCU1525 アクセラレーション開発ボードから U200 アクセラレーション開発ボードに移行する場合などです。

次のトピックについて説明します。

  • FPGA デバイスの物理的な側面を含むデザイン移行プロセスの概要。
  • 新規リリースを使用する場合のホスト コードおよびデザイン制約の変更。
  • カーネル配置および DDR インターフェイス接続の制御。
  • パフォーマンスを達成するためにオプションを追加する必要のある新規シェルでのタイミング問題。

デザインの移行

1 つのターゲット プラットフォームにインプリメントされたアプリケーションを別のプラットフォームに移行するには、ターゲット プラットフォーム間の違いとその違いがデザインに及ぼす影響について理解することが重要です。

主な注意事項:

  • リリースで変更があったか。
  • 新規ターゲット プラットフォームに別のシェルが含まれているか。
  • カーネルを複数の SLR (Super Logic Region) に再分配する必要があるか。
  • デザインが新しいプラットフォームで必要な周波数 (タイミング) パフォーマンスを満たすか。

次の図に、このガイドおよびトピックで説明される移行フローを示します。

図: シェル移行のフローチャート



重要: デザインの移行を開始する前に、FPGA およびシェルのアーキテクチャを理解することが重要です。

FPGA アーキテクチャの理解

デザインを新しいターゲット プラットフォームに移行する前に、FPGA アーキテクチャの基礎を理解しておく必要があります。次の図に、ザイリンクス FPGA デバイスのフロアプランを示します。理解する必要のあるコンセプトは、次のとおりです。

  • SSI デバイス
  • SLR
  • SLR の配線リソース
  • メモリ インターフェイス

図: 4 つの SLR 領域を含むザイリンクス FPGA の物理的な表示



ヒント: 上記の FPGA フロアプランは、各 SLR に DDR メモリ インターフェイスを含む 4 つの SLR がある、SSI デバイスのものです。

スタックド シリコン インターコネクト デバイス

SSI デバイスでは、シリコン インターコネクトを介して複数のシリコン ダイが一緒に接続され、1 つのデバイスにパッケージされます。SSI デバイスを使用すると、かなり多くの接続が提供されるので、複数のダイ間でバンド幅の大きな接続ができるようになります。また、レイテンシもかなり低くなり、消費電力も複数の FPGA またはマルチチップ モジュールのいずれかのアプローチ方法よりもかなり低くなるほか、大量のインターコネクト ロジック、トランシーバー、およびオンチップ リソースを 1 つのパッケージに統合できるようになります。SSI デバイスの利点については、『ザイリンクスのスタックド シリコン インターコネクト テクノロジで飛躍的な FPGA 容量、帯域幅、電力効率を実現』 (WP380: 英語版日本語版) を参照してください。

Super Logic Region

SLR (Super Logic Region) は、SSI デバイスに含まれる 1 つの FPGA ダイ スライスです。複数の SLR コンポーネントがアセンブルされて、SSI デバイスになります。各 SLR には、ほとんどのザイリンクス FPGA デバイスに使用される能動回路が含まれます。この回路には、次が多く含まれます。

  • LUT
  • レジスタ
  • I/O コンポーネント
  • ギガビット トランシーバー
  • ブロック メモリ
  • DSP ブロック

1 つまたは複数のカーネルを SLR 内にインプリメントできます。1 つのカーネルを複数の SLR にまたがってインプリメントすることはできません。

SLR の配線リソース

FPGA にインプリメントされるカスタム ハードウェアは、オンチップ配線リソースを介して接続されます。SSI デバイスの配線リソースには、次の 2 種類があります。

SLR 間リソース
SLR 間配線リソースは、ハードウェア ロジックの接続に使用される、高速リソースです。SDAccel 環境では、カーネルをインプリメントする際にハードウェア エレメントを接続するのに最適なリソースが自動的に選択されます。
SLL (Super Long Line) リソース
SLL は、1 つの領域から次の領域へロジックを接続するために使用される SLR 間の配線リソースです。これらの配線リソースは、SLR 間配線よりも遅くなります。ただし、カーネルが 1 つの SLR に配置され、そこに接続される DDR が別の SLR にある場合、SDAccel 環境は自動的に専用ハードウェアをインプリメントして、パフォーマンスに影響なく SLL 配線リソースが使用されるようにします。配置の管理に関する詳細は、カーネル配置の変更 を参照してください。

メモリ インターフェイス

SLR にはそれぞれ 1 つまたは複数のメモリ インターフェイスが含まれます。これらのメモリ インターフェイスは DDR メモリの接続に使用され、ホスト バッファーのデータがカーネル実行前にコピーされます。カーネルは、それぞれデータを DDR メモリから読み込んで、結果を同じ DDR メモリに書き戻します。メモリ インターフェイスは FPGA のピンに接続し、メモリ コントローラー ロジックを含めます。

シェルの理解

SDAccel 開発環境では、シェルとはカスタム ロジックまたはアクセラレータが追加される前に FPGA にインプリメントされるハードウェア デザインのことです。シェルではターゲット プラットフォームで使用される FPGA の属性が定義され、次の 2 つの領域が含まれます。

  • カーネルおよびデバイス マネージメント ロジックを含むスタティック領域。
  • アクセラレーションされたカーネルのカスタム ロジックが配置されるダイナミック領域。
次の図に、シェルが適用された FPGA を示します。

図: 4 つの SLR 領域を含む FPGA 上のシェル



シェル (ユーザーが変更できないスタティック領域) には、FPGA を動作させ、ダイナミック領域とのデータ転送に必要なロジックが含まれます。スタティック領域 (図のグレーの部分) は 1 つの SLR 内に含まれることもあれば、上記の例のように複数の SLR にまたがっていることもあります。スタティック領域には、次が含まれます。

  • DDR メモリ インターフェイス コントローラー
  • PCIe® インターフェイス ロジック
  • XDMA ロジック
  • ファイアウォール ロジックなど

ダイナミック領域は、上記の図の白色の部分です。この領域には、シェルのリコンフィギャラブル コンポーネントすべてが含まれ、すべてのアクセラレータ カーネルが配置されます。

スタティック領域はデバイスで使用可能なハードウェア リソースの一部を使用するので、ダイナミック領域にインプリメントされるカスタム ロジックではその残りのリソースしか使用できません。上記の例では、シェルは FPGA の使用可能な 4 つの DDR メモリ インターフェイスすべてを定義しています。これには、DDR インターフェイスで使用されるメモリ コントローラー用のリソースが必要になります。

各シェルのダイナミック領域にインプリメントされるロジックの量については、『SDx 開発環境リリース ノート、インストール、およびライセンス ガイド』 を参照してください。この詳細は、この後のカーネル配置の変更でも説明します。

リリースの移行

新規ターゲット プラットフォームに移行する前に、新しいプラットフォームのターゲットを別の SDAccel 環境リリースに変更する必要があるかどうかも決定する必要があります。ターゲットを新しいリリースに変更する場合は、まず新しいソフトウェア リリースを使用して既存のプラットフォームをターゲットとして、変更が必要ないかどうかを確認してから、新しいターゲット プラットフォームに移行することを強くお勧めします。

既存プラットフォームを使用して新しいリリースをターゲットにする手順は、次のとおりです。

  • ホスト コードの移行
  • リリースの移行
重要: 新しいリリースに移行する前に、『SDx 開発環境リリース ノート、インストール、およびライセンス ガイド』 を参照することをお勧めします。

ホスト コードの移行

SDAccel 環境の 2018.3 リリースでは、ザイリンクス ランタイム (XRT) 環境およびシェルのインストール方法は基本的に異なっています。前のリリースでは、XRT 環境とシェルが SDAccel 環境をインストールすると自動的に含まれていました。これは、ホスト コードをコンパイルするのに必要な設定で示されます。

2018.3 のインストールの詳細は、『SDx 開発環境リリース ノート、インストール、およびライセンス ガイド』 を参照してください。

XILINX_XRT 環境変数は、XRT 環境のディレクトリを指定するのに使用され、ホスト コードをコンパイルする前に設定する必要があります。XRT 環境をインストールしたら、/opt/xilinx/xrt/setup.csh または /opt/xilinx/xrt/setup.sh ファイルを適宜読み込んで XILINX_XRT 環境変数を設定できます。次に、LD_LIBRARY_PATH 変数も XRT インストール ディレクトリを指定するようにします。

コンパイルして、ホスト コードを実行するには、SDAccel インストールから<SDX_INSTALL_DIR>/settings64.csh または <SDX_INSTALL_DIR>/settings64.sh ファイルを読み込むようにしてください。

GUI を使用する場合は、新しい XRT ディレクトリが自動的に読み込まれ、プロジェクトを構築すると makefile が生成されます。

ただし、カスタマイズした makefile を使用する場合は、次のような変更を加える必要があります。

  • makefile では、前のリリースで使用した XILINX_SDX 環境変数は使用しないようにします。
  • XILINX_SDX 変数およびパスは、XILINX_XRT 環境変数に変更する必要があります。
    • インクルード ディレクトリは、-I${XILINX_XRT}/include および -I${XILINX_XRT}/include/CL のように指定します。
    • ライブラリ パスは -L${XILINX_XRT}/lib のように指定します。
    • OpenCL™ ライブラリは libxilinxopencl.so のように指定します。このため、makefile ファイルで -lxilinxopencl を使用します。

リリースの移行

ホスト コードを移行したら、SDAccel 開発環境の新しいリリースを使用して、既存のターゲット プラットフォームでコードをビルドします。新しいリリースの SDAccel 環境でプロジェクトを実行して、問題なく動作するかどうか、タイミングを満たしているかどうかを確認します。

新しいリリースを使用した場合は、次のような問題が発生する可能性があります。

  • C ライブラリまたはライブラリ ファイルの変更。
  • カーネルのパス名の変更。
  • カーネル コードに埋め込まれた HLS プラグマまたはプラグマ オプションの変更。
  • C/C++/OpenCL コンパイラ サポートの変更。
  • カーネルのパフォーマンスの変更 (既存カーネル コードのプラグマを調整する必要があることあり)。

これらの問題は、カーネルの開発で使用したのと同じ手法を使用して解決します。この段階では、新しいリリースを使用してターゲット プラットフォームのスループット パフォーマンスが要件を満たすかどうかを確認します。最終的なタイミング (最大クロック周波数) に変更がある場合は、新しいターゲット プラットフォームに移行してから、問題を解決します。これについては、タイミングの解決 で説明しています。

カーネル配置の変更

新しいプラットフォームにターゲットを変更する際の主な問題は、既存のカーネル配置が新しいターゲット プラットフォームで動作するようにすることです。各ターゲット プラットフォームには、シェルで定義された FPGA が含まれます。次の図に示すように、シェルは異なっていることがあります。

  • 左側の元のプラットフォームのシェルには SLR が 4 つあり、スタティック領域が 4 つの SLR すべてにまたがっています。
  • 右側のターゲット プラットフォームのシェルには SLR が 3 つしかなく、スタティック領域はすべて SLR1 内に完全に含まれています。

図: ハードウェア プラットフォームのシェルの比較



このセクションでは、カーネルの配置前の変更方法を説明します。

新しいハードウェア プラットフォームに移行する際の注意点

次の図に、新規ターゲット プラットフォームまたはシェルに移行する際に発生するカーネル配置の問題を示します。この例では、次のようになっています。

  • 既存のカーネルの kernel_B は新しいターゲット プラットフォームの SLR2 には大きすぎて収まりません。これは、この SLR のほとんどがスタティック領域で使用されているからです。
  • 新しいターゲット プラットフォームには既存のプラットフォームのように SLR が 4 つないので、既存のカーネルの kernel_D は新しい SLR に移動する必要があります。

図: プラットフォームの移行: カーネルの配置



新しいプラットフォームに移行する場合は、次を実行する必要があります。

これらについては、次のセクションで説明します。

カーネルを配置する場所の決定

カーネルを配置する場所を決めるには、次の 2 つの情報が必要です。

  • ハードウェア プラットフォーム (.dsa) のシェルの各 SLR で使用可能なリソース。
  • 各カーネルに必要なリソース。

これら 2 つの情報を使用すると、シェルの各 SLR にどのカーネルを配置するかを決定できます。

これらを計算する際は、使用可能なリソースの 10% がシステム インフラストラクチャで使用される可能性があることに注意してください。

  • インフラストラクチャ ロジックは、カーネルが SLR 境界をまたぐ必要がある場合にカーネルを DDR インターフェイスに接続するのに使用できることがあります。
  • FPGA では、リソースが信号配線にも使用されます。信号配線にもリソースが必要なので、FPGA で使用可能なリソースを 100% 使用することはできません。

使用可能な SLR リソース

ザイリンクス で提供される各 SLR で使用可能なリソースについては、『SDx 開発環境リリース ノート、インストール、およびライセンス ガイド』 を参照してください。次の図は、サンプル シェルです。この例では、次を確認できます。

  • SLR 記述は、どの SLR にスタティック領域やダイナミック領域が含まれるかを示しています。
  • 各 SLR で使用可能なリソース (LUT、レジスタ、RAM など) がリストされます。

これにより、各 SLR でどのリソースが使用可能かどうかを判断できます。

表 1. ハードウェア プラットフォームの SLR リソース
エリア SLR 0 SLR 1 SLR 2
SLR 記述 デバイスの最下部、ダイナミック領域専用。 デバイスの中部、ダイナミック領域およびスタティック領域リソースで共有。 デバイスの最上部、ダイナミック領域専用。
ダイナミック領域の Pblock 名 pfa_top_i_dynamic_region_pblock _dynamic_SLR0 pfa_top_i_dynamic_region_pblock _dynamic_SLR1 pfa_top_i_dynamic_region_pblock _dynamic_SLR2
計算ユニット配置構文 set_property CONFIG.SLR_ASSIGNMENTS SLR0[get_bd_cells<cu_name>] set_property CONFIG.SLR_ASSIGNMENTS SLR1[get_bd_cells<cu_name>] set_property CONFIG.SLR_ASSIGNMENTS SLR2[get_bd_cells<cu_name>]
ダイナミック領域で使用可能なグローバル メモリ リソース
メモリ チャネル、システム ポート名 bank0 (16 GB DDR4) bank1 (16 GB DDR4、スタティック領域)

bank2 (16 GB DDR4、ダイナミック領域)

bank3 (16 GB DDR4)
ダイナミック領域で使用可能なファブリック リソースの概算
CLB LUT 388K 199K 388K
CLB レジスタ 776K 399K 776K
ブロック RAM タイル 720 420 720
UltraRAM 320 160 320
DSP 2280 1320 2280

カーネル リソース

各カーネルのリソースは、システム見積もりレポートからわかります。

システム見積もりレポートは、ハードウェア エミュレーションまたはシステム実行のいずれかが終了したら、[Assistant] ビューに表示されるようになります。次は、そのレポートの例です。

図: システム見積もりレポート



  • FF は、各 SLR のプラットフォーム リソースの箇所に記述された CLB レジスタのことです。
  • FF は、各 SLR のプラットフォーム リソースの箇所に記述された CLB レジスタのことです。
  • DSP は、各 SLR のプラットフォーム リソースの箇所に記述された DSP のことです。
  • ブロック RAM は、各 SLR のプラットフォーム リソースの箇所に記述されたブロック RAM タイルのことです。

この情報は、カーネルごとに適切な SLR を指定するのに役立ちます。

カーネルの SLR への割り当て

デザインの各カーネルは、配置ファイルを指定する xocc --slr コマンド ライン オプションを使用して SLR 領域に割り当てることができます。カーネルを配置する場合は、xocc --sp コマンド ライン オプションを使用して、カーネルが接続される特定の DDR メモリ バンクを割り当てることもお勧めします。次の例では、これらの 2 つのコマンド ライン オプションを説明します。

次の図は、既存のターゲット プラットフォームのシェルには 4 つの SLR が含まれ、新規プラットフォームのシェルには 3 つの SLR が含まれ、スタティック領域の構造がターゲット プラットフォーム間で異なる例を示しています。この移行の例の詳細は、次のとおりです。

  • Kernel_A は SLR0 にマップされます。
  • Kernel_B は SLR1 にはフィットしなくなったので、使用可能なリソースがある SLR0 にリマップされます。
  • Kernel_C は SLR2 にマップされます。
  • Kernel_D は使用可能なリソースがある SLR2 にリマップされます。

カーネル マップは、次の図に示すようになります。

図: カーネルの SLR へのマップ



カーネル配置の指定

上記の例の場合、カーネルは次の xocc コマンド オプションを使用して配置されます。
xocc --slr kernel_A:SLR0 \
  --slr kernel_B:SLR0 \
  --slr kernel_C:SLR2 \
  --slr kernel_D:SLR2
これらのコマンド ライン オプションを使用すると、各カーネルが上記の図のように配置されます。

カーネル DDR インターフェイスの指定

カーネル配置を指定する場合は、カーネル DDR メモリ インターフェイスも指定する必要があります。DDR インターフェイスを指定すると、別の SLR にある DDR インターフェイスへのカーネル接続が自動的にパイプライン処理されるようになります。これにより、タイミングが落ちることはないので、最大クロック周波数を削減される可能性があります。

この例では、上記の図のカーネル配置を使用して、次が実行されます。

  • Kernel_A はメモリ バンク 0 に接続されます。
  • Kernel_B はメモリ バンク 1 に接続されます。
  • Kernel_C はメモリ バンク 2 に接続されます。
  • Kernel_D はメモリ バンク 1 に接続されます。
次の xocc コマンド ラインでこれらの接続が実行されます。
xocc --sp kernel_A.arg1:bank0 \
  --sp kernel_B.arg1:bank1 \
  --sp kernel_C.arg1:bank2 \
  --sp kernel_D.arg1:bank1
重要: --sp オプションを使用してカーネル ポートをメモリ バンクに割り当てる際は、カーネルのすべてのインターフェイス/ポートに対して --sp オプションを指定する必要があります。詳細は、『SDAccel 環境プログラマ ガイド』 の「DDR バンクとカーネルの接続のカスタマイズ」を参照してください。

タイミングの解決

システム実行が違反なく終了すれば、正しく移行されています。

タイミングが満たされなかった場合は、タイミングが満たされるようにカスタム制約を指定する必要があることもあります。タイミングを満たすための詳細は、『UltraFast 設計手法ガイド (Vivado Design Suite 用)』 (UG949)を参照してください。

カスタム制約

カスタム制約は、カスタムの配置およびタイミング制約を伝えるために xocc -xp オプションを使用して Vivado® に渡されます。カーネルのフロアプラン用のカスタムの Tcl 制約は、新しいターゲット プラットフォーム (.dsa) で確認する必要があります。たとえば、カーネルを新しいシェルでは別の SLR に移動されると、そのカーネルの配置制約も変更する必要があります。

通常は、タイミングは異なるターゲット プラットフォーム間 (9P Virtex UltraScale デバイス ベース) で比較可能です。タイミング クロージャ用のカスタム Tcl 制約はすべて、新しいプラットフォーム用に評価して変更する必要があります。

また、デフォルト以外のオプションが xocc または Vivado ツール (xocc --xp オプションを使用) に渡される場合も、新しいシェル用にアップデートする必要があります。

タイミング クロージャに関する注意事項

SDx™ リリースまたはシェルを移行すると、特に次のいずれかの条件が当てはまる場合は、デザイン パフォーマンスおよびタイミング クロージャが変わってしまうことがあります。

  • タイミング クロージャにフロアプラン制約が必要であった。
  • デバイスまたは SLR 使用率が通常のガイドラインよりも大きかった。
    • LUT 使用率が 70% を超えていた。
    • DSP、RAMB、UltraRAM 使用率が 80% を超えていた。
    • FD 使用率が 50% を超えていた。
  • タイミング クロージャのためにコンパイル ストラテジに多くのエフォートが必要であった。
使用率ガイドラインには、デザインのコンパイル時間が長くなったか、またはパフォーマンスが初期見積もりよりも低下したかを示すしきい値があります。複数の SLR を必要とする大型のデザインの場合は、xocc コマンド ラインでカーネル/DDR の関連付けを指定して、フロアプラン制約で次のようになるかどうかを確認します。
  • 各 SLR の使用率が推奨ガイドラインよりも低い。
  • ハードウェア リソースの 1 つのタイプがガイドラインよりも多く必要な場合に、その使用率が SLR 間にバランスを取って分配されている。

全体的に使用率の高いデザインの場合、カーネルでパイプライン処理の量を増やすと (レイテンシは長くなる)、タイミング クロージャが達成しやすくなり、パフォーマンスも達成しやすくなります。

上記の点をすべてすばやく確認するには、SDx フロー内で次の 2 つのいずれかのオプションを使用してフェイルファースト レポートを生成します。
  • xocc –R 1
    • report_failfast が各カーネルの合成段階の終わりに実行されます。
    • report_fafailst がデザイン全体の opt_design の後に実行されます。
    • opt_design DCP が保存されます。
  • xocc –R 2
    • -R 1 と同じレポートに加え、次が追加されます。
    • report_failfast は各 SLR の配置後に実行されます。
    • その他のレポートおよび中間 DCP が生成されます。

すべてのレポートおよび DCP は、カーネル合成レポートも含め、中間ディレクトリに保存されます。

<runDir>/_x/link/vivado/prj/prj.runs/impl_1

タイミング クロージャおよびフェイルファースト レポートの詳細は、『UltraFast 設計手法タイミング クロージャ クイック リファレンス ガイド』 (UG1292) を参照してください。