#pragma unrollandfuse
适用的调用
| 编译指示 (pragma) | xlc (编译 C) | xlC (编译 C++) | xlclang(编译 C) | xlclang++(编译 C++) |
|---|---|---|---|---|
#pragma unrollandfuse |
✓ | ✓ |
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表 。
类别
用途
指示编译器尝试对嵌套的 for 循环执行 unroll 和 fuse 操作。
语法
参数
- 号
- 循环取消滚动因子。
数字的值是一个正整数常数表达式。
数字的值是正标量整数或编译时常量初始化表达式。
如果未指定 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];
}
}
}
