カーネル最適化 - 2020.2 Japanese

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2021-03-22
Version
2020.2 Japanese

カーネルがターゲット プラットフォームのプラグラマブル ロジックで実行されるので、タスクをその環境に最適化することがアプリケーション デザインの重要な要素です。C/C ++ カーネル で説明する最適化手法のほとんどが OpenCL カーネルに適用できます。C/C++ カーネルに使用する HLS プラグマを適用するのではなく、OpenCL 属性 で説明するように __attribute__ キーワードを使用します。次に例を示します。

// Process the whole image 
__attribute__((xcl_pipeline_loop))
image_traverse: for (uint idx = 0, x = 0 , y = 0  ; idx < size ; ++idx, x+= DATA_SIZE)
{
   ...
}

上記の例は、for ループの image_traverse をパイプライン処理して、カーネルのパフォーマンスを改善する必要があります。この場合、ターゲット II は 1 です。詳細は、xcl_pipeline_loop を参照してください。

次のコード例では、ウォーターマーク関数で opencl_unroll_hint 属性を使用して、Vitis コンパイラがループを展開して、レイテンシを削減してパフォーマンスが改善されるようにしています。ただし、この場合、__attribute__ は提案にすぎないので、コンパイラは必要であれば無視できます。詳細は、opencl_unroll_hint を参照してください。

//Unrolling below loop to process all 16 pixels concurrently
__attribute__((opencl_unroll_hint))
watermark: for ( int i = 0 ; i < DATA_SIZE ; i++)
{
   ...
}

OpenCL カーネルでサポートされる特定の最適化については OpenCL 属性、それらの最適化のカーネル デザインでの適用方法は C/C ++ カーネル を参照してください。