ループは、chess_flatten_loop
プラグマを使用して完全にフラット化できます。これは、aiecompiler
により最適に自動化されない小型のループに便利です。
ループのフラット化では、ループ カウントはコンパイラにより決定されます。ツールでループ カウントを自動的に判断できない場合は、
chess_loop_count
プラグマを使用してループ カウントを設定できます。次に例を示します。for(int i=0;i<6;i++) chess_flatten_loop {...}
for(...) chess_loop_count(6) chess_flatten_loop {...}
chess_unroll_loop(N)
を使用すると、ループ本体を N-1
回複製でき、ループ カウントは N
で除算されます。ループは、chess_unroll_loop(*)
を使用して完全に展開することもできます。ループは展開され、同様の独立した文の繰り返しシーケンスに記述し直されます。
ループのフラット化は最終的なスケジューリング フェーズで実行され、コード生成はループ コンストラクトに基づいて実行されます。ループのフラット化とは異なり、ループ展開ではコードの反復が重複し、重複したコードは異なるコンパイルが可能です。これにより、ループのソフトウェア パイプライン処理をより効果的に実行できます。ただし、展開されたループの回数が多い場合、スケジューリングに負担をかけることもあります。