Vivado HLSを使った行列積演算について記事を書いた。
この場合、データ転送も含めてどの程度時間がかかっているんだろう。サイクル計測機能を使って計測してみた。
なるべく時間をかけるために、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
これから、高速化について検討していこう。