NVDLAの構造
NVDLAのハイレベルの構造は次の図のようになっている。上側のControl BusはCPUやマイクロコントローラにつながっており、入力データなどをプロセサから受け取り、NVDLAの処理ブロックに供給する。
Input Activationsと書かれたブロックは、受け取った入力をConvolution Coreに供給する。また、Filter WeightはMemory Interfaceを通してDRAMなどからフィルタ要素の値を読み込む。そして、Convolutionを計算し、その出力にPost-Processingを施す。その出力はメモリに書き込まれ、次の層の入力になる。
NVDLAは、この入力とフィルタの値を一時的に格納するConvolutional Bufferを持っており、このバッファにあるデータはメモリから読むよりも高速に読み出すことができる。
NVDLAの構成手法
NVDLAはパラメタ化されたRTLで提供され、Convolutional BufferのサイズやConvolution Coreの持つMAC演算器の数、Post-Processingで扱える処理の種類、メモリの量などをメニューの中から選んでアクセラレータを作ることができる。
Convolutional Bufferの容量を大きくすれば、アクセスするデータはバッファに入っており、SDRAMメモリをアクセスしなくても済むという場合が増える。結果として、うまくバッファを使えば必要なメモリバンド幅を小さく抑えることができる。
Convolutional Bufferが重み全体の1/Nの容量であると、Convolutionを計算するには入力データをN回読む必要がある。例えばGoogleNetのinception 4aという層の処理では、要素のデータは16bitの精度でフィルタは3×3要素である。そして、入力データは1.2MB、重みデータは360KBのサイズである。バッファサイズが128KBの場合、重みは3回に分けて読み込む必要があり、Convolutionの計算には1.2MBの入力を3回読み込む必要がある。つまり、SDRAMには、1層の処理の間に3.6MBのデータが読み込めるバンド幅が必要になる。
なお、Convolutional Bufferは入力と重みを同時に読み出す必要があるので、チップ面積を食うマルチポートメモリセルが必要である。一方、RAMは1ポートでも良く、コンパクトなメモリセルが使える。
Convolutionalコアの考え方
入力が64要素で、64要素のフィルタを4個使う場合は、64MAC演算を4回行う必要がある。この演算をアトミックに行うため256個のMAC演算器が必要になる。
Convolutionalコアは、次の図に示すように、フィルタを適用して畳み込みを計算し、次にフィルタを適用する入力位置を矢印のように右へ動かす。これを繰り返して、横一列の畳み込み計算を行う。そして、それが終わったらSwitch Cと書かれているように、奥行き方向にフィルタの適用位置をずらせて行く。
C方向に要素の数が多くなると、より多くの乗算を同時に行い、より多くの積を同時に加算する必要があり、幅の広いWallace Treeが使えるが、境界が整合していないと、より多くのMAC演算器が無駄になると書かれているが、どのような状況を想定しているのか、それがArea and Powerにどのように影響するのか、説明がなく理解できない。
次の、積和演算では重みの方を何回も使いまわして、入力を変えて行く順序で計算すればデータ転送が減り、消費電力を減らせるは理解できる。また、和の計算では、全部の合計を計算してからまるめを行う方が精度が高い。和を何度かに分けて計算するとそれぞれの和を高精度で計算する必要があり、無駄が出るというのも理解できる。
(次回は9月20日に掲載します)