インテル® HLS コンパイラー: ユーザーガイド

ID 683456
日付 12/22/2017
Public
ドキュメント目次
ご意見・ご要望

10.3.1. ループ分析例

High Level Design レポート (report.html) ファイル例は、transpose_and_fold.cpp ( <quartus_installdir>/hls/examples/tutorials/best_practices/loop_memory_dependencyで提供されるチュートリアル・ファイルの一部 ) から取得した HLS コンポーネントのデザインのループ分析を表示します。

transpose_and_fold.cppで次のコードスぺニット例を考察します。

01: #include "HLS/hls.h"
02: #include <stdio.h>
03: #include <stdlib.h>
04: 
05: #define SIZE 32
06: 
07: typedef ihc::stream_in<int> my_operand;
08: typedef ihc::stream_out<int> my_result;
09: 
10: component void transpose_and_fold(my_operand &data_in, my_result &res)
11: {
12:   int i;
13:   int j;
14:   int in_buf[SIZE][SIZE];
15:   int tmp_buf[SIZE][SIZE];
16:   for (i = 0; i < SIZE * SIZE; i++) {
17:     in_buf[i / SIZE][i % SIZE] = data_in.read();
18:     tmp_buf[i / SIZE][i % SIZE] = 0;
19:   }
20: 
21:   #ifdef USE_IVDEP
22:   #pragma ivdep safelen(SIZE)
23:   #endif
24:   for (j = 0; j < SIZE * SIZE * SIZE; j++) {
25:   #pragma unroll
26:     for (i = 0; i < SIZE; i++) {
27:       tmp_buf[j % SIZE][i] += in_buf[i][j % SIZE];
28:     }
29:   }
30:   for (i = 0; i < SIZE * SIZE; i++) {
31:     res.write(tmp_buf[i / SIZE][i % SIZE]);
32:   }
33: }
図 4. transpose_and_fold コンポーネントのループ分析レポート

transpose_and_foldコンポーネントはループが 4 つのあります。ループ分析レポートは、コンパイラーが異なる種類のループ最適化の結果を表示します。

  • 24 行目のループは #pragma unrollの定義として、すべて展開されています。
  • 16 行目と 30 行目のループは、II の値が 1 でパイプラインされています。

ループ分析レポート内のBlock1.startループはコード内には現れません。これは、コンポーネントが 1 回のみではなく連続的に実行できるようにコンパイラーが追加する暗黙的な無限ループです。