SDAccel でのソフトウェア アクセラレーション
ザイリンクス FPGA は、プロセッサ アーキテクチャと比較すると、アプリケーションの実行を高い割合で並列処理可能なプログラマブル ロジック (PL) ファブリックで構成されます。カーネル用に SDAccel™ で生成されるカスタム プロセッシング アーキテクチャでの実行パラダイムは CPU 実行とは異なり、パフォーマンスを大幅に向上できる可能性があります。既存のアプリケーションを FPGA でアクセラレーションするようリターゲットすることもできますが、FPGA アーキテクチャを理解し、それに基づいてホストおよびカーネル コードを変更することにより、パフォーマンスを大幅に向上できます。ホストおよびカーネル コードの記述およびそれらの間でのデータ転送に関する詳細は、『SDAccel 環境プログラマ ガイド』 を参照してください。
CPU のリソースは固定されており、タスクまたは演算を並列処理する機会は限られます。プロセッサは、そのタイプにかかわらず、プログラムをプロセッサのコンパイラ ツールで生成された命令シーケンスで実行します。コンパイラ ツールは、C/C++ で記述されたアルゴリズムをターゲット プロセッサにネイティブのアセンブリ言語の構文に変換します。2 つの値の加算などの単純な演算でも、複数クロック サイクルで実行される複数のアセンブリ命令になります。これが、キャッシュ ヒット率を上げて命令ごとのプロセッサ サイクル数を削減するためにアルゴリズムを再構築するのにソフトウェアエンジニアが時間を費やす理由です。
一方 FPGA は、本質的に並列処理デバイスであり、プロセッサ上で実行可能などんな演算関数でもインプリメントできます。ザイリンクス FPGA には多数のリソースが含まれており、任意のカスタム アーキテクチャをインプリメントするようプログラムおよび設定して、事実上任意のレベルの並列処理を達成可能です。すべての計算で同じ ALU が共有されるプロセッサとは異なり、FPGA では演算がプロセッシング リソースの設定可能な配列に分配されて実行されます。FPGA コンパイラにより、各アプリケーションまたはアルゴリズム用に最適化された固有の回路が作成されます。FPGA プログラミング ファブリックは、アクセラレーション関数を定義してインプリメントする空のキャンバスとして機能します。
SDAccel コンパイラは、スケジューリング、パイプライン処理、およびデータフローの処理により FPGA ファブリックの機能を活用します。
- スケジューリング: 異なる演算間のデータおよび制御の依存性を特定し、各演算をいつ実行するかを決定するプロセスです。コンパイラにより隣接する演算間および時間を超えた依存性が解析され、演算を同じクロック サイクルで実行したりデータフロー依存性で許容される場合に関数呼び出しをオーバーラップさせるため、演算がグループ化されます。
- パイプライン処理: 演算または関数の独立した段階をオーバーラップさせることにより、アルゴリズムのハードウェア インプリメンテーションの命令レベルの並列処理を増加する手法です。機能が等価になるよう元のソフトウェア インプリメンテーションのデータ依存性は保持されますが、必要な回路は独立した段のチェーンに分割されます。チェーンのすべての段は、同じクロック サイクルで並列実行されます。パイプライン処理は詳細な最適化で、次の関数呼び出しまたは演算を開始する前に現在の関数呼び出しまたは演算を完全に終わらせる必要があるという CPU の制限を取り除きます。
- データフロー: タスク レベルの並列処理をインプリメントし、FPGA にインプリメントした複数の関数を並列にパイプライン方式で実行できるようにします。コンパイラにより、プログラムの異なる関数間の相互関係が入力と出力に基づいて評価され、このレベルの並列処理が抽出されます。ソフトウェア実行では、この変換は 1 つのカーネル内の関数の並列実行に適用されます。
ザイリンクス FPGA のもう 1 つの利点は、動的にリコンフィギュレーション可能であるということです。コンパイル済みのプログラムをプロセッサに読み込むのと同様に、ランタイムで FPGA をリコンフィギュレーションすると、FPGA のリソースを別の目的に使用して、アクセラレーション アプリケーション実行としてカーネルを追加します。これにより、1 つの SDAccel アクセラレータ ボードで 1 つのアプリケーション内の複数の関数を順次または同時にアクセラレーションできます。