前回、Chiselを使ってDot Productアクセラレータを作ったが、まだ正しく答えが一致していなかった。
一応デバッグしてプログラムを正しく走ることが出来るようにして、まずは16x16のサイズで正しく問題が計算されていることを確認した。
肝心の性能だが、
構成 | サイクル数 |
---|---|
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の行数)を設定している。今回は、行列 を用意して計算する。
matrixmul_two()
が、実際にDot Productを計算する部分だ。計算したい の該当する行と列のポインタを入力して、 matrixmul_setlen()
で設定した回数だけDot Productを計算する。
かなりでかいので、シミュレーションでは測定できない。とりあえずFPGAに焼いて確認かな。
Dot Product アクセラレータをFPGAに焼いて動作確認
とりあえず前回と同じ方法でFPGAに書き込んで動作させてみた。なんだかソフトウェアと答えが合わないので要検算だが、だいたい、
構成 | サイクル数 |
---|---|
Dot Productアクセラレータによる計算 | 22700378 |
ソフトウェアによる計算 | 52869863 |
速度的にはせいぜい2倍程度になってしまったなあ。何が悪いんだろう?要解析。