はじめに
KV260 には K26 SoMが搭載されています。実際には KV260 にはコネクタが片方しかついてないとかいろいろあるのですが、一旦そこは置いておいて、K26 SoM モジュールをデータ帯域観点で見てみたいと思います。
以前にリアルタイムコンピューティングのメモリ階層という記事で少し触れたのですが、外部 I/O の考察が無かったとか、Read/Write のポートを分けた集計とかもしてなかったので、そのあたりを追加しつつもう少し上位レイヤから眺めてみたいと思います。
調べてみた
調べてみたのが下記です。基板としてHPIOの差動信号にシングルエンド2本が通せるかなどは不明ですが、Vivadoでタイミングエラーが出ない限界帯域の設定で理論限界を調べるとこんな感じになりました(間違いあったらごめんなさい)。
bit | MHz | 個数 | Mbps | 備考 | |
---|---|---|---|---|---|
FF(write) | 1 | 725 | 234,240 | 169,824,000 | |
FF(read) | 1 | 725 | 234,240 | 169,824,000 | |
BRAM(write) | 72 | 585 | 144 | 6,065,280 | SDPメモリとして利用時 |
BRAM(read) | 72 | 585 | 144 | 6,065,280 | SDPメモリとして利用時 |
URAM(write) | 72 | 500 | 64 | 2,304,000 | |
URAM(read) | 72 | 500 | 64 | 2,304,000 | |
OCM(write) | 128 | 500 | 1 | 64,000 | |
OCM(read) | 128 | 500 | 1 | 64,000 | |
DDR4-SDRAM | 64 | 2,133 | 1 | 136,512 | ReadとWriteは同時にできない |
HDIO | 1 | 250 | 69 | 17,250 | |
HPIO | 1 | 1,250 | 116 | 145,000 | シングルエンドで限界まで使う想定 |
GTH(tx) | 1 | 12,500 | 4 | 50,000 | |
GTH(rx) | 1 | 12,500 | 4 | 50,000 |
帯域に関する考察
計算機というのは何かしらデータが入力され、出力されることでお仕事をします。その際に如何に効率よく演算できるかというのは計算機の性能を考える上で重要です。
例えば、入力されたデータがFPGA内の全ての演算器を1回だけ通過して出力されてくれれば、演算器は100%稼働することになり、大変効率がよい、という事になりますが、そんな単純なアプリはレアケースで、実際には一度メモリに溜めたデータに繰り返し演算を施すという事がしばし発生します。つまりデータの再利用です。
その時に、階層メモリという考え方は非常に重要です。
今回まとめた内容を見ると、
- DDR4-SDRAMや OCM はI/O帯域と同程度のオーダー
- BRAM や URAM などのFPGA内部のメモリのもつ帯域は I/O に 1~2桁大きい
- 演算の一時出力先であるFFの帯域(≒ 演算帯域は)さらに 1~2桁大きい
というのが見えてきます。
そうしてくると
- FF は圧倒的演算量において、I/O入力で埋まらない分を BRAM 等から再利用を掛ける
- BRAM や URAM は、データを一時的にバッファしたり、パラメータを置いたりしてデータを再利用してFFに供給
- DDR4-SDRAM や OCM は過去のデータの参照や、大きなデータの並べ替えの為に数往復させる程度
という使い方になってくると思われます。
HPC 分野などでは B/F (Bytes per Flops) という考え方があり、例えば行列乗算のようなものなど局所的なデータの再利用が起こる演算では、メモリを階層化して(L1キャッシュ/L2キャッシュとか)、低い B/F でも高い計算効率が出せる事が知られています。
私がなじみが深い画像処理の分野や深層学習のCNNなどでは、画像をよく 3x3 とか 5x5 などの単位でフィルタ演算します。これは同じピクセルが周辺 5x5 などで計算に利用されるので例えば25回再利用されたりするのですが、上下の画像をラインバッファに入れたり、ブロックバッファに溜め込んだりして局所的にデータを再利用して演算を進めるような事を行います。こうすると演算に必要な25倍の入力データ帯域が確保できるわけです。
他にも例えば HDMI から入力された画像を上下で反転させて出力したいなどと言う場合、一度 DDR4-SDRAM に溜め込んで逆順に読みだすしか方法がありません。
どういう演算がしたくて、どこにどういう帯域を割り振るのかというのはアーキテクチャ設計で非常に重要ですが、FPGA の場合、品番選択以上のリソース調整は出来ませんので、FPGAが予め持っているリソースの性能を把握しておいて、適切にアルゴリズムを考える事は重要かと思います。
おわりに
今回は、データ帯域という観点から KV260 (というか K26SoM) を眺めてみました。 なにかの参考になれば幸いです。