データをバースト転送すると、メモリ アクセスのレイテンシが隠され、帯域幅の使用率およびメモリ コントローラーの効率が改善します。
推奨: バースト転送は、連続したアドレス位置からの連続するデータ要求から推論されます。詳細は、バースト読み出しおよび書き込み を参照してください。
バースト転送が発生すると、詳細なカーネル トレースに表示されるバースト率とバースト長の値が大きくなります。
図 1. 詳細なカーネル トレースに表示されるバースト データ転送
上の図では、AXI インターコネクトの後のメモリ データ転送も異なる方法でインプリメントされているのがわかります (トランザクション時間が短縮)。これらのトランザクション上にカーソルを置くと、AXI インターコネクトが 16 x 4 バイトのトランザクションを 1 つの 1 x 64 バイトのパッケージ トランザクションにパックしたことがわかります。この方が、AXI4 帯域幅がより効率的に使用されます。次のセクションでは、この最適化手法について詳細に説明します。
バースト インターフェイスはコーディング スタイルとアクセス パターンによって大きく異なります。ただし、次のコード例に示すように、データ転送と計算を分離すると、バースト検出が容易になり、パフォーマンスが改善します。
void kernel(T in[1024], T out[1024]) {
T tmpIn[1024];
T tmpOu[1024];
read(in, tmpIn);
process(tmpIn, tmpOut);
write(tmpOut, out);
}
つまり、read
関数が AXI 入力から内部変数 (tmpIn)
に読み込みを実行し、計算は内部変数 tmpIn
および tmpOut
に対して演算を実行する process
関数でインプリメントされ、write
関数は生成された出力を取り込んで AXI 出力に書き込みます。
計算から読み出し関数と書き込み関数を分離すると、次のようになります。
- 読み出し/書き込み関数の制御構造 (ループ) がシンプルになり、バースト検出がシンプルになります。
- AXI インターフェイスから計算関数を分離すると、可能なカーネル最適化が単純になります。詳細は、カーネル最適化 を参照してください。
- 内部変数はオンチップ メモリにマップされるので、AXI トランザクションよりも高速にアクセスできます。Vitis コア開発キットでサポートされるアクセラレーション プラットフォームには最大 10 MB のオンチップ メモリがあり、パイプ、ローカル メモリ、およびプライベート メモリとして使用できます。これらのリソースを効率的に使用することで、アプリケーションの効率およびパフォーマンスを大幅に向上できます。