-loop-unroll-and-jam: Unroll and Jam Loops
在了解这个 pass 之前需要学习的背景知识是 Loop Transformation。
Description
-loop-unroll-and-jam 是指对 nested loop 中 outer loop 给 unroll 的时候,同时对 inner loop 做一下 jam(i.e. fusion)。
这么做可以让代码更简洁,降低 branch penalty,进而提升 performance。这个听起来很抽象,不过下面看个例子其实就好了。
Code Example
给定一段原始的 C code。
for(int i=0; i<100; i++)
for(int j=0; j<100; j++)
code_body(i, j);
-loop-unroll 之后,可以 transform 成如下的 C code。
for(int i=0; i<100; i+=4){
for(int j=0; j<100; j++)
code_body(i, j);
for(int j=0; j<100; j++)
code_body(i+1, j);
for(int j=0; j<100; j++)
code_body(i+2, j);
for(int j=0; j<100; j++)
code_body(i+3, j);
}
可以看到有点 redundant 对吧,我们看看 -loop-unroll-and-jam 会变成啥。
for(int i=0; i<100; i+=4)
for(int j=0; j<100; j++){
code_body(i, j);
code_body(i+1, j);
code_body(i+2, j);
code_body(i+3, j);
}
确实更简洁了。