ホワイトペーパー

2次元FFTの高速化

Stratix 10 MXでHBM2とoneAPIを使う。

概要

HBM2メモリを搭載したFPGAは、アルゴリズムに「コーナーターン」が含まれる場合、GPUチップよりも高速に動作します。これは、FPGAがコーナーターン操作を計算とオーバーラップさせることができるため、レイテンシーの観点から「自由」になるためです。2次元FFTを使用してこのテクニックを実証し、以下にソースコードを提供します。公平性を保つために、このコードではGPUもサポートするデータ型を使用しています。FPGAはどんなデータ型でも簡単に処理することができます。 

BittWare 以前、インテルのOpenCLコンパイラを使用してFPGA用の2D FFTカーネルを作成しました。今回、そのコードをIntelのoneAPIプログラミングモデル、特にDPC++プログラミング言語を活用するように書き直しました。520N-MXカードでも 同様の性能を得ることができました。インテルは、oneAPIをGPUやFPGAを必要とするアプリケーションに最適なツールチェーンとして推進していますアクセラレーション 。

なぜ2次元FFTを実装したのか?

2次元FFTはFPGAのIPライブラリに含まれていることが多いため、プログラマーが自分で実装することは一般的ではありません。しかし、並列ハードウェア上での2D FFTの一般的な実装戦略には、CPUやGPUで性能の大きなボトルネックとなる「コーナーターン」または「データ転置」ステップが含まれています。

フリーコーナーターン

このデモで強調したのは、FPGAの実装では、計算と並行してデータの転置を行うことができるため、レイテンシーの観点からほぼ「無料」であるということです。

GPUは、GPUアーキテクチャがHBM2/GDDR6メモリに触れずに中間結果をパイプライン化するのに十分なメモリをGPU内部に持たないため、同じことができない。

コーナーターンのある1次元FFTを2パスして実装した2次元FFTの説明図。

oneAPIを使用したFPGAでのHBM2の使用について

Stratix 10 MXには32個の擬似HBM2メモリチャンネルがあります。私たちの2D FFTの実装では、その半分のチャンネルを使用しています。
  • チップ内に2つの2D FFTカーネルを配置することができます。1つのカーネルは、チップの北側にあるすべての擬似チャネル・インターフェースを使用します。 もう1つは、南側のチャネルを使用します。
  • 1つの2D FFTで32チャンネルすべてを使おうとすると、デモコードでは扱いたくなかったルーティングの課題が発生します。
各2D FFTカーネルは、使用したMX2100 FPGAのDSPリソースの約30%を消費する。

FPGAのHBM2チャンネルに1列ずつ配置

2D FFTは、多数の1D FFTを使用して実装されています。単一の1次元FFTは、それが使用するHBM2チャネルを飽和させます。16個のHBM2チャンネルを使用することで、2D FFTの実装は1024行のマトリックスの16行を並列に処理します。 ハイエンドGPUであれば、おそらく1回のパスで1024行すべてを処理することができます。FPGAの場合は64パスが必要です。ただし、どちらの場合もHBM2/GDDR6の帯域幅が制限要因となるため、パスの数は重要ではありません。

400MHz Fmaxは十分です

各HBM2チャンネルを飽和させ、最適な32バイトバーストを行うには、400MHzのOpenCLクロック周波数が必要です。より高速にすることは価値がありません。もっと遅くても最適ではありません。Intelの現在のDPC++の実装は、BittWareの既存のOpenCLボードサポートパッケージを利用しています。したがって、どちらの実装も FPGA からは OpenCL のように見えます。どちらの実装も、400MHzを達成するために同じ調整を必要とします。この微調整は、ソースコードでの表現が異なるだけです。

1D FFT出力

1D FFTは、結果を直接HBM2に出力するわけではありません。代わりにFPGAの内部メモリに書き込まれます。FPGAの追加ロジックは、複数の1D FFTの結果を収集し、それらの結果をコーナーターンしてHBM2に書き戻す。

1D FFT ディレイドスタート

16個の1次元FFTを同じクロックサイクルで開始するわけではありません。その代わりに、1つの複素数要素ごとに開始点をずらしています。こうすることで、1次元FFTの結果をコーナーターン・ロジックにパイプライン接続することができます。

32バイトバースト

転置したデータを32バイトのチャンクでHBMに書き込めるようにするためには、4つの1次元FFTの出力を待つ必要があるのです。

oneAPIを使ったプログラミングのしやすさ

BittWareの開発チームは、RTL(VerilogとVHDL)、HLS(主にC++)、OpenCL、そして今回のDPC++を使用しています。 以前、RTLとHLSを比較したホワイトペーパーを発表しました。今回のプロジェクトは、OpenCLとDPC++を比較する最初の機会でした。

FPGA用のOpenCLコードからFPGA用のDPC++への移行は簡単だったことをご報告します。FPGAとHBM2オンパッケージメモリに特有の適応は、OpenCLバージョンと非常に似ていました。 ホストコンピュータ上でのデータ移動も簡単でした。OpenCL版では試みなかったNumPyからの2次元FFTカーネル呼び出しもできました。

oneAPI for FPGAの概要ビデオアクセラレーション

その他の詳細

内蔵メモリーを予備に

M20Kメモリを512枚(MX2100の12.5%)使用しています。

2D FFT パラメータ

FPGA に実装される FFT の長さは、通常、ビットストリームのコンパイル時に設定されます。

  1. このデモでは、複雑な32ビット浮動小数点数の固定1024×1024マトリックスを使用しています。
  2. FFTの実装では、複素数の成分をインターリーブしています(実数行列と虚数行列を別々に使用するのとは異なります)。
  3. データはHBMメモリにコピーされ、そこで32バイトアライメントになるので、アライメントは実際には重要ではありません。

1D FFTの実装

FPGAのIPライブラリを使用するのではなく、独自の1次元FFTを実装しました。この1次元FFTは基数2で、完全にパイプライン化されています。インプレースではありません。

パフォーマンス

2D FFTの性能は、常にHBM2の帯域幅によって制限されます。したがって、私たちの焦点は、HBM2帯域幅を最大化できるアルゴリズムを見つけることです。これは、HBM2帯域幅のベンチマークを使用して、FFTの性能を正確に見積もることができるということでもあります。

同じデバイスに2つの独立したカーネルを搭載したバッチ1実装のHBM2のピーク性能は、291GBytes/Secです。パイプライン/バッチ処理時には、337GBytes/Secのピーク帯域幅が可能です。

結論

私たちは、2D FFTをOpenCLバージョンからoneAPIに素早く移植できたことを嬉しく思っています。HBM2対応のFPGAカード用にアプローチを最適化する作業はすでに終わっていましたが、OpenCLベースのユーザーには、最小限のインパクトで、BittWare のハードウェア上でoneAPIに移行する優れたパスが提供されます。

FPGA で HBM2 を使用することで、今回紹介したような特定のアプリケーションで大きなメリットを得ることができます。今回紹介したコードについて、より詳しい情報をお求めの方は、以下のフォームからお問い合わせください。また、BittWare の520N-MX FPGA カードについて、より詳しい情報をお求めの方は、以下のフォームからお問い合わせください。

ソースコードを要求する

このフォームに記入して、オープンソースのTARファイルをリクエストすることができます。 お渡しするコードには、オープンソースの凡例があります。

コードの使用方法

OneAPI 2D FFTをLinuxのダイナミックリンク、共有オブジェクトライブラリにコンパイルします。cmake . "と入力するだけで、そのライブラリが作成されます。

入力データを作成し、出力を検証またはプロットする簡単なNumPyスクリプトから、このライブラリを呼び出します。python runfft.py "と入力すると、グラフが表示されます。

上記のソフトウェアは、MX2100 FPGAをホストするBittWare 520N-MXカードを使って、Centos 8でIntel OneAPI tools Beta 10リリースをテストしました。このカード用にリリースされたOpenCLボードサポートパッケージは、OneAPIを動作させることも可能です。

"*"は必須項目

名称*
PDFはこのアドレスを使って送信されますので、これが有効なメールであることを確認してください。
住所・都市名*