XilinxのUG1253を見れば、わかるんだけどSDSoCのpragmaってそんなに多くないのね。
でも、どのpragmaをどこに入れると効果的なのかがいまいちわからないんだ。
ここからはこういう場合もあったという話・・・
例えば、次のようなforループなコードがあったとしよう。
for(y = 0; y < height; ++y){
for(x = 0; x < width; ++x>){
フィルタ演算;
}
}
これでパイプライン化するなら、どこを対象にする?
フィルタ演算だよね。
なので、、、
for(y = 0; y < height; ++y){
for(x = 0; x < width; ++x>){
#pragma HLS pipeline
フィルタ演算;
}
}
こうだよね。
これはパイプラインになるんだよ。
じゃぁ、forループを1階層上に上がってみよう。
for(y = 0; y < height; ++y){
#pragma HLS pipeline
for(x = 0; x < width; ++x>){
フィルタ演算;
}
}
こんな風に・・・
これはパイプラインにならないんだなぁ。
じゃぁ、forループをもう1階層上に上がってみよう。
#pragma HLS pipeline
for(y = 0; y < height; ++y){
for(x = 0; x < width; ++x>){
フィルタ演算;
}
}
これはパイプラインになるんだなぁ。
これだとコンパイラのご機嫌を伺いながらpragmaの設定を追加しなければいけない。
だから、SDSoCは難しい。
次のように配列を伴う関数が合ったとするでしょ。
void hoge(a[2048], b[2048]...){
演算;
}
これをSDSoCで展開する方法は大きくは2つある。
DMA転送させるか、させないか。
で、DMA転送させない場合、BRAMをFPGA側に置く必要がないケースもある。
そのときにでもBRAMを使用する予測値がデバイスのBRAM総数を超えるとエラー終了する。
デバイスを大きくして確認してみると、BRAMの使用個数が0個でも予測の時点でデバイスの総数を超えるとエラーになる。
ちょっと待てよ・・・
BRAMに展開するかしないかはSDSoCが決めるんだよね。
なんで、BRAMにしないとわかっているのにBRAMの下図を予測するんだ?
高位合成の設定って大きくはパイプラインとメモリの転送方式の2つだと思っている。
この設定がこんなに複雑でご機嫌取りしながらソースコードを書かなきゃいけないなんて・・・
だから、SDSoCって難しい・・・