循环可通过 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(*)
完全展开。循环作为一连串重复性的相似独立语句进行展开并重写。
循环平铺在最终调度阶段完成,从而确保仍能基于循环构造来完成代码生成。不同于循环平铺,循环展开会复制代码迭代,复制的代码可采用不同方式来编译。这可用于改善软件循环流水打拍。但如果展开的循环计数过大,那么这也会给调度施加负担。