ループ/関数内の並列化
Cコードは1行ずつ上から順に実行されるものだが、矛盾しなければ複数行を並列に実行してもかまわない。
高位合成で並列化できる部分としてループ/関数内がある。
◇
例としてループ内に処理A,B,Cがあるとする。何も指定しなければ順に実行される
for(i=0; i<=3; i++) { 処理A 処理B 処理C } |
◇◇
(1) ループ展開(UNROLL指定)
・pragma HLS unrollを指定すると、ループを展開して同時に実行可能なものがあれば実行する。
for(i=0; i<=3; i++) { #pragma HLS unroll 処理A 処理B 処理C } |
◇◇◇
(2) パイプライン化(PIPELINE指定)
・pragma HLS pipelineを指定すると、もし可能ならばi回目の処理が終わる前にi+1回目の処理を開始する。この開始間隔をinitiation interval(II)、開始から終了までを Latencyとよぶ。
・style=flpを指定しないと、入力が止まったときに出力を出し切らずに止まってしまうので注意。
・pipeline指定したループの内側にあるループは自動的に展開される(IIを守るために)。
for(i=0; i<=3; i++) { #pragma HLS pipeline II=2 type=flp 処理A 処理B 処理C } |