ひでみのアイデア帳

くだらないことなんだけど、忘れないために・・・

SDSoCのpragma

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は難しい。

BRAM使わないくせにBRAM足りないなんて言うなよ!

次のように配列を伴う関数が合ったとするでしょ。

void hoge(a[2048], b[2048]...){
  演算;
}

これをSDSoCで展開する方法は大きくは2つある。

DMA転送させるか、させないか。

で、DMA転送させない場合、BRAMをFPGA側に置く必要がないケースもある。

そのときにでもBRAMを使用する予測値がデバイスのBRAM総数を超えるとエラー終了する。

デバイスを大きくして確認してみると、BRAMの使用個数が0個でも予測の時点でデバイスの総数を超えるとエラーになる。

ちょっと待てよ・・・

BRAMに展開するかしないかはSDSoCが決めるんだよね。

なんで、BRAMにしないとわかっているのにBRAMの下図を予測するんだ?

高位合成の設定って大きくはこの2つなのに・・・

高位合成の設定って大きくはパイプラインとメモリの転送方式の2つだと思っている。

この設定がこんなに複雑でご機嫌取りしながらソースコードを書かなきゃいけないなんて・・・

だから、SDSoCって難しい・・・