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 |
|
参考资料
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!