1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

インテル® Agilex™ FPGAでoneAPIサンプルコードの性能を確認してみた

Last updated at Posted at 2022-05-18

はじめに

こんにちは。

最近、とある事情でこれを数週間預かることになりまして。

このボード、現時点(2022年5月現在)ではAgilex™デバイスを使ってoneAPIで遊ぶのに一番良いボードと思ってます。値段もそこそこだし、この状況下で在庫もそれなりにありそうだし。

ということで、なかなか性能が良いで評判のAgilex™ FPGAを使って、dpc++実装だとどの程度のFmaxが出るのか主要なリファレンスデザインを使って試してみました。

え、それだとボード要らないじゃんって?いや、ちゃんとボード入手しないとTerasicさんのBSP使用権がないですから…

で、リファレンスデザインは以下のコマンドで生成しましたが、

$ oneapi-cli

恐らく以下にあるものと同じです。

また、コンパイルの仕方は基本的にすべて共通ですので、皆さん同じ結果を得られるはずです。cmakeでboardを指定していることに注意してください。

$ mkdir build
$ cd build
$ cmake .. -DFPGA_BOARD=de10_agilex:B2E2_8GBx4
$ make fpga

Fmax評価

いきなりですが、結果は以下のようになりました。Seedは特にいじっていないので、Seedを振ればもっと良い結果になる可能性はあります。
ちなみに、今回使ったボードに載っているAgilex™デバイスはAGF014というタイプで、主要なリソース量は以下になります。

ALM: 487,200
RAM block: 7,110
DSP block: 4,510

リファレンスデザイン名 Kernel Fmax ALM使用数 M20K使用数 DSP使用数
Adaptive Noise Reduction (anr) 550.35MHz 99,946 743 31
CRR Binomial Tree Model for Option Pricing (crr) 502.51MHz 428,613 2,863 1,280
Database Query Acceleration (db) 531.34MHz 245,081 1,238 120
GZIP Compression (gzip) 526.31MHz 279,238 4,002 0
Merge Sort (merge_sort) 243.19MHz 249,381 1,245 0
MVDR Beamforming (mvdr_beamforming) 406.0MHz 166,815 1,187 615
QR Decomposition of Matrices (qrd) 525.21MHz 239,409 2,854 2,083

もちろんデザインによるんですが、比較的複雑なデザインでもあっさり500MHzを超えてきてますね。さすがAgilex™。特に、crrなんかはALMを9割近く使っているのに、500MHz超えてます。
dpc++でこの結果ということは、HLSだともっと頑張れるかもです。

リソース使用量によるFmax低下評価

通常FPGAでは、内部リソースの使用率が100%に近づいてくるとFmaxが落ちる傾向があります。
ここでは、簡単にカーネルの複製数を調整できる以下のサンプルを使って、内部リソース使用量が増えていくとFmaxがどう変化するかを見てみます。

このサンプルの、以下を増やすとカーネル数が増やせるようです。15行目あたり。

src/compute_units.cpp
constexpr size_t kEngines = 5;

ただし、このままだと256までしか増やせません。std:make_index_sequenceを使ってカーネルを増やしているためで、ここの制限を外してやる必要があります。そのために、CMakeLists.txtを修正します。30行目あたり。

src/CMakeLists.txt
set(HARDWARE_COMPILE_FLAGS "-Wall ${WIN_FLAG} -fintelfpga -fbracket-depth=512")

上記のように-fbranket-depthオプションをを追加してやればOK。

今回のサンプルでは、カーネル数が372で上限となりました。373個にすると、以下のエラーメッセージで終了します。

Error (22191): Fitter requires 48619 LABs to implement the design, but the device contains only 48720 LABs. Fitting has terminated due to high LAB utilization.

結果ですが、以下のようになりました。今回もSeedの設定はしていませんので、Defaultの状態になっています。時間があれば、Seedをある程度振ってベストの値でまとめたいところですが…

Kernel数 Kernel Fmax ALM使用数 M20K使用数 DSP使用数
5 537.63MHz 83,250 551 0
10 563.06MHz 88,207 556 0
50 539.33MHz 137,657 598 0
100 539.33MHz 193.383 651 0
200 517.06MHz 303,895 757 0
250 540.54MHz 357,003 807 0
300 492.36MHz 408,779 858 0
350 566.57MHz 448,077 921 0
370 565.61MHz 468,624 941 0
372 490.43MHz 469,690 943 0

image.png

さすがAgilex™、使用率が96%を超えてもびくともしないですね。
カーネル300個のところでFmaxが落ちていますが、試しにSeed=2で試したところ539.33MHzという結果が得られました。少なくともカーネル370個付近までは、安定して530MHz以上の結果が得られそうです。Seedを振れば570MHz近辺も余裕そうですね。
372個のところでもFmaxが落ちていますが、ここは10パターンほどSeed振ってもむしろMETすらしない(373個のときと同じ症状)感じでした。さすがにこの辺が容量的には限界のようです。
とはいえ、Agilex™がやはりよく詰まるというのは確かなように見えます。

まとめ

今回の結果からして、dpc++でカーネルを書いて9割以上ぎゅうぎゅうに回路を詰め込んでも、500MHz以上で動いてくれる可能性が比較的高そうです。
皆さんもぜひ使ってみてください。

それでは。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?