unroll_and_jam/nounroll_and_jam

unroll_and_jam/nounroll_and_jam

启用或禁用循环展开和阻塞。这些指令只能应用于迭代for循环。

Syntax

#pragma unroll_and_jam #pragma unroll_and_jam (n) #pragma nounroll_and_jam

Arguments

展开因子,表示展开循环的次数;必须是0到255之间的整数常数

Description

unroll_and_jam指令部分展开套中比最内层循环更高的一个或多个循环,并将结果循环融合/阻塞回一起。这种转换允许在循环中进行更多的重用。

此pragma对最内层循环无效。确保紧随其后的循环不是编译器发起的交换完成后的最内层循环。

指定此pragma是向编译器提示展开和阻塞序列是合法且有利可图的。编译器会在任何可能的情况下启用这种转换。

对于它影响的每个for循环,unroll_and_jam指令必须在for语句之前。如果指定了n,优化器将展开循环n次。如果n被省略或超出允许的范围,优化器将分配展开循环的次数。编译器通过比较n和循环计数生成正确的代码。

只有在设置了编译器选项O3时,才支持此pragma。unroll_and_jam指令将覆盖从命令行展开循环的任何设置。

当展开循环会增加寄存器压力和代码大小时,可能需要防止展开嵌套循环或不完美的嵌套循环。在这种情况下,使用nounroll_and_jam编译指令。nounroll_and_jam pragma提示编译器不要展开指定的循环。

Examples

Use the unroll_and_jam pragma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int a[10][10]; 
int b[10][10];
int c[10][10];
int d[10][10];
void unroll(int n) {
    int i,j,k;
    #pragma unroll_and_jam (6)
    for (i = 1; i < n; i++) {
       #pragma unroll_and_jam (6)
       for (j = 1; j < n; j++) {
          for (k = 1; k < n; k++){
            a[i][j] += b[i][k]*c[k][j];
            }
       }
    }
}

参考资料

unroll_and_jam nounroll_and_jam (intel.com)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!