FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

Rocket ChipのChiselを使ってアクセラレータを作る (行列積アクセラレータのアイデア出し)

Rocket ChipとChiselの勉強を進めてきた。RoCCのインタフェースにChiselで記述したアクセラレータを接続して、その効果を測定した。

まずは簡単化のために、RoCCインタフェースからメモリの値を読み込んで、その値をすべて加算するプログラムを書いてみた。 これは以下の記事にまとまっている。

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

この記事では、アクセラレータを導入したことによりソフトウェアと比較して大よそ2倍の性能を得ることができた。 今度は、ディープラーニングなどで話題の行列積について、何か高速化のためのアイデアは作れないだろうか。

今回は、まずは整数Dot Productを実行するデザインをChiselで作ってみる。これを組み合わせて、行列積を実行するという方式にしてみよう。 つまり、以下のようなものになる。

ちなみに、浮動小数点数において似たような研究はUCBのRISC-Vチームが研究している。 Vengineerさんも紹介していた以下の論文だ。この論文、絶対性能での評価が書いていないから若干怪しいなあ。。。

blogs.yahoo.co.jp

  • A Hardware Accelerator for Computing an Exact Dot Product

https://aspire.eecs.berkeley.edu/wp/wp-content/uploads/2017/05/exact-dot-product-arith2017.pdf

話を戻して、具体的には、以下の行列の計算の一部分を実行するアクセラレータを作成する。

f:id:msyksphinz:20170915012415p:plain

アクセラレータの実装

f:id:msyksphinz:20170915013559p:plain

アクセラレータの実装詳細の解説は、諸事情でここでは省略するが、ソフトウェア側では、上記の矢印で記述した整数のDot Productを、1命令で実行する。 今回は、まずは  16\times 16 の行列積に限定してアクセラレータを記述した。

  printf ("Hardware Start\n");
  start_cycle = read_csr(mcycle);
  for (int i = 0; i < 16; i++) {
    for (int j = 0; j < 16; j++) {
      matrixmul (output_data[j*16+i], &(input1_data[j*16]), &(input2_data[i]));
    }
  }
  stop_cycle = read_csr(mcycle);

これをソフトウェアで測定すると、サイクル数の比率は以下のようになった。だいたい2.7倍の高速化だ。

  • ハードウェアアクセラレータ使用 : 17166 サイクル
  • ソフトウェアのみで実装 : 47435 サイクル

実は、ハードウェアによる高速化、という観点よりも、Rocket Chip自体がかなり高速だなということに驚いている。 もっと引き離すと思っていたのだが、予想外に2.7倍の高速化にとどまった。

逆に、何故そこまでRoCC経由では高速にならないのだろう?ここを調査する必要がある。