#pragma stream_unroll
适用的调用
| 编译指示 (pragma) | xlc (编译 C) | xlC (编译 C++) | xlclang(编译 C) | xlclang++(编译 C++) |
|---|---|---|---|---|
#pragma stream_unroll |
✓ | ✓ |
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表 。
类别
用途
启用优化后,将 for 循环中包含的流划分为多个流。
语法
参数
- 号
- 循环取消滚动因子。
数字的值是一个正整数常数表达式。
数字的值是正标量整数或编译时常量初始化表达式。取消滚动因子 1 将禁用取消滚动。
如果未指定 number ,那么优化器将为每个嵌套循环确定适当的取消滚动因子。
使用量
要启用流取消滚动,必须指定 -qhot 和 -qstrict, 或 -qsmp,或者使用优化级别 -O4 或更高级别。 如果 -qstrict 生效,那么不会进行流取消滚动。
要进行流取消滚动, #pragma stream_unroll 伪指令必须是在 for 循环之前指定的最后一个编译指示。
对同一个 循环指定 for #pragma stream_unroll 多次,或将其与其他循环展开指令 (#pragma unroll 、#pragma nounroll 、#pragma unrollandfuse 、#pragma nounrollandfuse) 结合使用,都会导致警告。
编译器会忽略同一 循环中指定的多个循环展开指令,但最后一个除外。 for
示例
以下示例显示 #pragma stream_unroll 如何提高性能。
int i, m, n;
int a[1000];
int b[1000];
int c[1000];
....
#pragma stream_unroll(4)
for (i=0; i<n; i++) {
a[i] = b[i] * c[i];
}
4 的解卷因子将迭代次数从 n 减少到 n/4,如下所示:m = n/4;
for (i=0; i<n/4; i++){
a[i] = b[i] + c[i];
a[i+m] = b[i+m] + c[i+m];
a[i+2*m] = b[i+2*m] + c[i+2*m];
a[i+3*m] = b[i+3*m] + c[i+3*m];
}增加的读和存储操作数分布在由编译器确定的多个流中,这减少了计算时间并提高了性能。