#pragma stream_unroll

适用的调用

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

类别

优化和调整

用途

启用优化后,将 for 循环中包含的流划分为多个流。

语法

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

参数

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

取消滚动因子 1 将禁用取消滚动。

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

使用量

要启用流取消滚动,必须指定 -qhot-qstrict-qsmp,或者使用优化级别 -O4 或更高级别。 如果 -qstrict 生效,那么不会进行流取消滚动。

要进行流取消滚动, #pragma stream_unroll 伪指令必须是在 for 循环之前指定的最后一个编译指示。 仅限 C 对同一个 循环指定 for #pragma stream_unroll 多次,或将其与其他循环展开指令 (#pragma unroll 、#pragma nounroll 、#pragma unrollandfuse 、#pragma nounrollandfuse) 结合使用,都会导致警告。 仅限 C + + 编译器会忽略同一 循环中指定的多个循环展开指令,但最后一个除外。 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];
}
增加的读和存储操作数分布在由编译器确定的多个流中,这减少了计算时间并提高了性能。

相关信息