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

ID 683456
日付 12/22/2017
Public
ドキュメント目次

10.5.2. メモリー・レプリケーションとストール可能な LSU に関する情報のレビュー

transpose_and_foldコンポーネント ( <QPDS_installdir>/hls/examples/tutorials/loop_memory_dependencyで提供される tutorial ファイルの一部 ) から抜粋した次のコード例を考察します。

01 #include "HLS/hls.h"
02 #include "stdio.h"
03 #include "stdlib.h"
04 
05 #define SIZE 32
06 
07 typedef altera::stream_in<int> my_operand;
08 typedef altera::stream_out<int> my_result;
09 
10 void transpose_and_fold(my_operand &a, my_operand &b, my_result &c)
11 {
12   int i;
13   int j;
14   int a_buf[SIZE][SIZE];
15   int b_buf[SIZE][SIZE];
16   for (i = 0; i < SIZE * SIZE; i++) {
17     a_buf[i / SIZE][i % SIZE] = a.read();
18     b_buf[i / SIZE][i % SIZE] = b.read();
19   }
20 #ifdef USE_IVDEP
21   #pragma ivdep
22 #endif
23   for (j = 0; j < SIZE * SIZE * SIZE; j++) {
24     #pragma unroll
25     for (i = 0; i < SIZE; i++) {
26       b_buf[j % SIZE][i] += a_buf[i][j % SIZE];
27     }
28   }
29   for (i = 0; i < SIZE * SIZE; i++) {
30     c.write(b_buf[i / SIZE][i % SIZE]);
31   }
32 }

下の図は 23 行目のBlock3でループのレビューを促すために赤くハイライトされたことを示しています。Block3のループ分析は、II の値が 2 でパイプラインされていることを表し、ループのパイプラインはデザインのスループットに影響を与える可能性があります。 Component Viewerは、II の値が b_buf可変へのロードへのメモリーの依存性に起因していることを示しています。

図 7. transpose_and_fold コンポーネントのシステムビューアー

ノード上にマウスを置くと、LSU に関する更なる情報を提供するツールチップとして詳細が表示されます。下の図では、ツールチップはロードのレイテンシーが 6 で、かつ LSU にストールがないという情報を表示しています。

図 8. ノードおよびツールチップの詳細ビュー

Component Viewerは、表示させたい接続種類の選択ができるようにします。Controlを選択すると、システムビューアーにブロックとループの間の接続の表示を指示します。Memoryを選択すると、 Component Viewerにグローバルメモリーおよびローカルメモリーへの接続とそれらからの接続の表示を指示します。Streamsを選択すると、システムビューアーにストリームからの読み出しとストリームへの書き込みを接続する表示を指示します。

図 9. ブロックとループの間が未接続の transpose_and_fold コンポーネントのシステムビュー