#pragma unrollandfuse

适用的调用

表 1. 接受给定编译指示的调用
编译指示 (pragma) xlc (编译 C) xlC (编译 C++) xlclang(编译 C) xlclang++(编译 C++)
#pragma unrollandfuse    
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表

类别

优化和调整

用途

指示编译器尝试对嵌套的 for 循环执行 unroll 和 fuse 操作。

语法

读取语法图跳过可视语法图#pragma nounrollandfuseunrollandfuse()

参数

循环取消滚动因子。 仅限 C 数字的值是一个正整数常数表达式。 仅限 C + + 数字的值是正标量整数或编译时常量初始化表达式。

如果未指定 number ,那么优化器将为每个嵌套循环确定适当的取消滚动因子。

使用量

#pragma unrollandfuse 伪指令仅适用于满足以下条件的嵌套 for 循环的外部循环:
  • 必须只有一个循环计数器变量、该变量的一个增量点和一个终止变量。 在循环嵌套中的任何位置都不能改变这些内容。
  • 循环不能有多个入口点和出口点。 循环终止必须是退出循环的唯一方法。
  • 循环中的依赖关系不能是“回顾”。 例如,诸如 A[i][j] = A[i -1][j + 1] + 4) 之类的语句不得出现在循环中。

要进行循环取消滚动, #pragma unrollandfuse 伪指令必须在 for 循环之前。 不得为最内部的 for 循环指定 #pragma unrollandfuse

不得多次指定 #pragma unrollandfuse ,也不得将该伪指令与 #pragma nounrollandfuse#pragma nounroll#pragma unroll#pragma stream_unroll 伪指令结合使用以用于同一 for 循环。

预定义的宏

无。

示例

在以下示例中, #pragma unrollandfuse 伪指令复制并融合了循环的主体。 这将减少阵列 b的高速缓存不命中数。
int i, j;
int a[1000][1000];
int b[1000][1000];
int c[1000][1000];


....

#pragma unrollandfuse(2)
for (i=1; i<1000; i++) {
    for (j=1; j<1000; j++) {
        a[j][i] = b[i][j] * c[j][i];
    }
}
下面的 for 循环显示了将 #pragma unrollandfuse (2) 伪指令应用于上述循环的可能结果:
for (i=1; i<1000; i=i+2) {
    for (j=1; j<1000; j++) {
        a[j][i] = b[i][j] * c[j][i];
        a[j][i+1] = b[i+1][j] * c[j][i+1];
    }
}
您还可以在嵌套循环结构中指定多个 #pragma unrollandfuse 伪指令。
int i, j, k;
int a[1000][1000];
int b[1000][1000];
int c[1000][1000];
int d[1000][1000];
int e[1000][1000];


....

#pragma unrollandfuse(4)
for (i=1; i<1000; i++) {
#pragma unrollandfuse(2)
    for (j=1; j<1000; j++) {
			for (k=1; k<1000; k++) {
            a[j][i] = b[i][j] * c[j][i] + d[j][k] * e[i][k];
        }
    }
}

相关信息