循环平铺和展开 - 2023.2 简体中文

AI 引擎内核与计算图编程指南 (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 简体中文

循环可通过 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(*) 完全展开。循环作为一连串重复性的相似独立语句进行展开并重写。

循环平铺在最终调度阶段完成,从而确保仍能基于循环构造来完成代码生成。不同于循环平铺,循环展开会复制代码迭代,复制的代码可采用不同方式来编译。这可用于改善软件循环流水打拍。但如果展开的循环计数过大,那么这也会给调度施加负担。