カーネルがターゲット プラットフォームのプラグラマブル ロジックで実行されるので、タスクをその環境に最適化することがアプリケーション デザインの重要な要素です。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 ++ カーネル を参照してください。