読者です 読者をやめる 読者になる 読者になる

FPGA開発日記

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

行列積演算のHLS設計高速化検討(1. サイクル数計測方法の構築)

Vivado

Vivado HLSを使った行列積演算について記事を書いた。

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

この場合、データ転送も含めてどの程度時間がかかっているんだろう。サイクル計測機能を使って計測してみた。

なるべく時間をかけるために、64x64の行列に拡張した。

#define MATRIX_LENGTH (64)

void matrix_mul (const float matrix_a[MATRIX_LENGTH][MATRIX_LENGTH],
                 const float matrix_b[MATRIX_LENGTH][MATRIX_LENGTH],
                 float matrix_c[MATRIX_LENGTH][MATRIX_LENGTH])
{
  for (int j = 0; j < MATRIX_LENGTH; j++) {
    for (int i = 0; i < MATRIX_LENGTH; i++) {
      matrix_c[j][i] = 0;
      for (int k = 0; k < MATRIX_LENGTH; k++) {
        matrix_c[j][i] += matrix_a[j][k] * matrix_b[k][i];
      }
    }
  }
  return;
}

以下のようにデータ転送、演算、データ回収の部分をまとめて、数回実行する。この間の時間を計測した。

  unsigned long start_time = pmon_start_cycle_counter ();
  int trial_count;
  for (trial_count = 0; trial_count < 20; trial_count++) {
      XMatrix_mul_Write_matrix_a_Words(p_matrix_mul, 0,
                                       (int *)matrix_a,
                                       XMATRIX_MUL_SLV0_DEPTH_MATRIX_A);
      XMatrix_mul_Write_matrix_b_Words(p_matrix_mul, 0,
                                       (int *)matrix_b,
                                       XMATRIX_MUL_SLV0_DEPTH_MATRIX_B);
      XMatrix_mul_Start (p_matrix_mul);

      while (!XMatrix_mul_IsDone (p_matrix_mul));

      XMatrix_mul_Read_matrix_c_Words (p_matrix_mul, 0, (int *)matrix_c, XMATRIX_MUL_SLV0_DEPTH_MATRIX_C);
  }

  unsigned long stop_time = pmon_read_cycle_counter();
  xil_printf ("start_time = %ld, stop_time = %ld\n",
              start_time, stop_time);

- 2回ループの場合 : 1942 - 20回ループの場合 : 19270

計測結果が間違えていた。修正2016/09/13

  • 2回ループの場合 : 548680
  • 20回ループの場合 : 5486812

これから、高速化について検討していこう。