この記事は 半導体・ハードウェア開発 Advent Calendar 2017 - Qiita の13日目の記事です。
Advent-Calendarを埋めてくれるかた、今からでも募集中です!是非参加してください! 私一人では、クオリティのある記事を続けられそうにありません。。。(弱音)
目次
- NVIDIAのディープラーニングアクセラレータNVDLAをVivadoでシミュレーションする
- NVDLAの勉強 (NVDLA Primerを読んでまとめる: ハードウェア編)
- NVDLAの勉強 (NVDLA Primerを読んでまとめる: ソフトウェア編)>
- NVDLA 1.0 がVerilatorに対応している(が、ビルドできるのは潤沢な資源を持つ金持ちだけ)>
- NVIDIAのオープンソース ディープラーニングアクセラレータを試す(1. NVDLAのビルドとシミュレーション環境構築)>
- NVIDIAのオープンソース ディープラーニングアクセラレータを試す(3. NVDLAの内部ブロック)>
- NVDLA Virtual Platformの試行 (1. ビルド試行 → 失敗)>
- NVDLA Virtual Platformの試行 (2. ビルド成功 → ログイン)>
NVDLAのシミュレーションを実行するとモジュールの構造が分かってくる。NVDLAの現在リリースされている構成で最大のもの(NV_full)を見てみると、大きく分けて5つのモジュールに分けられている。
- u_partition_o
- u_partition_c
- u_partition_ma
- u_partition_mb
- u_partition_a
- u_partition_p
に分けられている。これらのブロックについてちゃんとしたドキュメントが公開されていないため、あまり詳細は分からない。
u_partiotion_o
大きな演算モジュールは入っていなさそうだ。どちらかというと制御レジスタのような細々としたインタフェースが入っているような感じがしている。 それぞれの制御レジスタについては、 Hardware Architectural Specification — NVDLA Documentation が詳しい。外部インタフェースもこのモジュールと接続されているようである。
u_partition_c
名前からしてCovolution Unitであると思われる。CDMA (convolution DMA)なども入っているため、畳み込み演算を実行するためのエンジンだと思われる。
u_partition_ma, u_partition_mb
MACユニットだと思われる。partition_ma
, partition_mb
は同じユニット(u_partition_m
)なので、MACユニットが2つ搭載されていることになる。
さらに、partition_ma
には8つのMACユニットが接続されており、各MACには1024bitのデータバスが接続されている。結構な大きさだ。
u_partition_a
Accumulatorだろうか?レジスタファイルなども含まれている。
u_partition_p
p
は良く分からない。パイプライン制御ユニット?
sanity0テストパタンからみるレジスタの読み書きインタフェース
sanity0テストパタンは、NVDLAの外部からレジスタを読み書きするインタフェースだ。
テストパタンを見ると、制御レジスタ(CFG_DST_SURF_0
)を読み書きしている。
read_reg 0xffff100b 0xffffffe0 0x00000000 #NVDLA_BDMA.CFG_DST_SURF_0 write_reg 0xffff100b 0xf0a5a500 #NVDLA_BDMA.CFG_DST_SURF_0 read_reg 0xffff100b 0xffffffe0 0xf0a5a500 #NVDLA_BDMA.CFG_DST_SURF_0
この制御レジスタの読み書きは、レジスタをバスに直接見せているのではなく、リクエストが各ブロックに渡されてFIFOに積まれる。 FIFOから1つのリクエストが取り出され、その応答が解されるため、NVDLAの中でもRead/Writeリクエストのレイテンシは結構かかっている。 数10サイクルはかかっているかな?そりゃ、デザインは結構大きくなるような気がする。