FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-VプロセッサHiFive1で機械学習コードを動作させる(6. MNISTの性能解析と高速化)

f:id:msyksphinz:20170821013230p:plain

RISC-VプロセッサHiFive1でMNISTを動作させよう。実機デバッグをしていて、やっと動作するようになった。 バッチサイズを増やすとデータセクションが入りきらないのでいろいろ工夫したいが、もうちょっと軽量化できないだろうか。

HiFive1(32bit RISC-V)でのサイクルカウント

過去の記事を引用して、サイクル数をカウントして性能を測定する環境を構築した。

msyksphinz.hatenablog.com

改善前の性能

前回までのMNISTのプログラムで、100個分の画像を解析するのに必要なサイクル数を計測した。

Correct = 91
Time = 5216564625

double演算を削除する

どこか高速化できるところが無いだろうか?とりあえず、doubleの計算をしてしまっている所があり、それを削除して高速化していきたい。

   // fix16_in_data[i] = fix16_from_dbl (in_data[i] / 255.0);
      fix16_in_data[i] = (in_data[i] << 8);

これで少し高速化された。約5%の高速化だ。

Correct = 91
Time = 4961182594

バッチサイズを増やす

L1キャッシュの容量の関係上、とりあえずバッチサイズを2に増やした。この時のサイクル数は以下のようになった。 バッチサイズが1の時に比べて、1画像当たりのサイクル性能は少しだけ悪いなあ。なんでだろう。

f:id:msyksphinz:20170904021844p:plain

あと、そもそもlibfixmathで使っているfix16_tのデータタイプが、32bitなんだよなあ。これを16bitにしたい。。 せこい技を使うなら、そもそもデータもfix16の形式で入れておきたいんだよなあ。。。