FPGA開発日記

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

Rocket ChipのChiselを使ってアクセラレータを作る(Dot Productアクセラレータの性能評価)

前回、Chiselを使ってDot Productアクセラレータを作ったが、まだ正しく答えが一致していなかった。

msyksphinz.hatenablog.com

一応デバッグしてプログラムを正しく走ることが出来るようにして、まずは16x16のサイズで正しく問題が計算されていることを確認した。

f:id:msyksphinz:20170923021716p:plain

肝心の性能だが、

構成 サイクル数
Dot Productアクセラレータによる計算 15917
(16x16に決め打ちした)アクセラレータによる計算 11359
ソフトウェアによる計算 46396

と、決め打ちのアクセラレータに比べたら遅いのは仕方がない。でも一応汎用化できたので、次はFPGAに乗せて動作確認をする。

具体的には、以下のようなアクセラレータを呼び出す関数を組んで、行列積を計算させた。

void matrixmul_hw1 (int64_t *A, int64_t *B)
{
  int64_t output_data[N*K];
  uint64_t start_cycle, stop_cycle;

  printf ("Hardware Start <MatrixMul TwoRequester>\n");
  start_cycle = read_csr(mcycle);
  uint64_t dummy;
  matrixmul_setlen (dummy, M);
  for (int j = 0; j < N; j++) {
    for (int i = 0; i < K; i++) {
      matrixmul_two (output_data[j*N+i], &(input1_data[j*N]), &(input2_data[i]));
    }
  }
  stop_cycle = read_csr(mcycle);
  printf ("Hardware Finished. %ld-%ld=%ld\n", stop_cycle, start_cycle, stop_cycle-start_cycle);
  show_result(output_data);
}

matrixmul_setlen()が、行列積を計算する場合の計算の長さを決める(行列Aの列数=行列Aの行数)を設定している。今回は、行列 A(50\times 203), B(203\times 172) を用意して計算する。 matrixmul_two() が、実際にDot Productを計算する部分だ。計算したい (i,j) の該当する行と列のポインタを入力して、 matrixmul_setlen()で設定した回数だけDot Productを計算する。

かなりでかいので、シミュレーションでは測定できない。とりあえずFPGAに焼いて確認かな。

Dot Product アクセラレータをFPGAに焼いて動作確認

とりあえず前回と同じ方法でFPGAに書き込んで動作させてみた。なんだかソフトウェアと答えが合わないので要検算だが、だいたい、

構成 サイクル数
Dot Productアクセラレータによる計算 22700378
ソフトウェアによる計算 52869863

速度的にはせいぜい2倍程度になってしまったなあ。何が悪いんだろう?要解析。

f:id:msyksphinz:20170923031737p:plain