FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス <a href="https://msyksphinz.github.io/github_pages/">

NVDLAのConvolution DMAが実行する畳み込みの手順の解析

NVDLAというか、畳み込み演算をどのようにハードウェアで実現するかということをさらに掘り下げている。

  • NVDLA : Unit Description

Unit Description — NVDLA Documentation

NVDLAのConvolution DMAは、以下のような画像に対して入力画像とカーネルを畳み込むことを考える。ここではチャネルについては無視している。

上記の図における、各パラメータは以下の通りである。

  • Top Padding(TP) : 画像データに対して上部に何ピクセルパディングを入れるか。
  • Bottom Padding(BP) : 画像データに対して下部に何ピクセルパディングを入れるか。
  • Left Padding(LP) : 画像データに対して左部に何ピクセルパディングを入れるか。
  • Right Padding(RP) : 画像データに対して右部に何ピクセルパディングを入れるか。
f:id:msyksphinz:20180917161117p:plain
図. 画像畳み込みの前提条件パラメータ

これに対して、カーネルの畳み込みを行うと以下のようになる。ここでSXSYは畳み込みのストライド数である。 それぞれSX=4SY=3として表現している。

W', H' というのは畳み込み後の画像のサイズであるが、これを以下のように表現している。

  • W′=LP+W+RP−S′SX+1
  • H′=TP+H+BP−R′SY+1

ただし、

  • S′=(S−1)\times DX+1
  • R′=(R−1)\times DY+1

畳み込みをしていくのは以下のようなイメージだ。ここではX方向のストライド数=4, Y方向のストライド数=3としている。

f:id:msyksphinz:20180917161941p:plain
図. 画像に対する畳み込みの適用。

NVDLAにおける畳み込み演算

NVDLAにおけるアトミック操作

アトミック操作は重みカーネルの1ドットに対して掛け算を実施する計算に相当する。

f:id:msyksphinz:20180917163050p:plain
図. カーネルK0 - K15 に対してドット0を掛け合わせる。

これは以下の計算をしていることに相当する。

  • [0] × [00](K0)
  • [0] × [00](K1)
  • [0] × [00](K2)
  • [0] × [00](K3)
  • [0] × [00](K15)

ここでは、カーネルの数を1として考えてみる。そうすると、上記の図における画像の座標0と、カーネルの座標00の乗算を行っていることに相当する。

f:id:msyksphinz:20180917164000p:plain

NVDLAにおけるストライプ操作

ストライプ操作は、上記のアトミック操作を連続して実行することに相当する。カーネルの位置は変えずに、入力画像の位置をずらす。

先ほどの式を拡張して考えると、上記の図における画像の座標0から座標21までの四角形の16要素と、カーネルの座標00の乗算を行っていることに相当する。

f:id:msyksphinz:20180917164204p:plain

NVDLAにおけるブロック操作

ブロック操作は、上記のブロック操作をさらに連続して実行する。画像の位置と、カーネルの位置を変えながら演算を行う。カーネルのサイズは3\times 3なので、画像の位置を0,1, 2, 6, 7, 8, 12, 13, 14とずらす。 一方でカーネルの位置も、00, 01, 02, ... 08 までずらす。

先ほどの式を拡張して考えると以下のような演算を実行している。

f:id:msyksphinz:20180917164548p:plain

最終的な畳み込みは以下のように行方向に加算することで計算できる。

f:id:msyksphinz:20180917165553p:plain