


本文主要介绍循环剥离部分。实验环境是CentOS7 + LLVM。
循环剥离(loop peeling)用于将循环中数据首地址不对齐的引用,以及循环末尾不够装载到一个向量寄存器的数据剥离出来,使剩余数据满足向量化对齐的要求。
LLVM编译器中,循环展开优化通常与循环剥离配合使用。循环剥离的相关编译选项如下所示:
(1)-mllvm -unroll-peel-count=<参数>:指定循环剥离计数
通过-unroll-peel-count 参数写定数值,编译器会按照该数值剥离循环;若未指定该值,则会在循环展开优化遍中计算循环剥离的值。
(2)LLVM中,循环剥离主要被循环展开优化调用,因此可以加入以下选项:
-Rpass=loop-unroll:显示循环剥离优化相关的信息
-Rpass-missed=loop-unroll:显示循环剥离优化失败的相关信息
示例代码如下所示,将其命名为loop_peel.c.

运行命令:
(1)clang loop_peel.c -O2 -mllvm -unroll-peel-count=2 -Rpass=loop-unroll -Rpass-missed=loop -unroll
可以通过命令(1)打开循环剥离的编译优化选项。

之后通过如下命令来分析循环剥离前后程序的执行时间。
(2)clang loop_peel.c -o loop_peel-before
(3)./loop_peel-before
(4)clang loop_peel.c -O2 -mllvm -unroll-peel-count=2 -o loop_peel-after
(5)./loop_peel-after

可以看出,循环剥离优化前后,得到的计算结果都是一样的,但是经过循环剥离优化后,程序的执行时间明显要比优化前的执行时间短,达到了优化的效果。
循环剥离也是常见的循环优化方法之一。循环剥离用于将循环中数据首地址不对齐的引用,以及循环末尾不够装载到一个向量寄存器的数据剥离出来,使剩余数据满足向量化对齐的要求。优化人员需要根据实际情况选择打开或关闭循环剥离功能。
(1)CUDA 学习(十九)、优化策略4:线程使用、计算和分支_cuda分支-CSDN博客
(2)循环优化 (Oracle Solaris Studio 12.2:性能分析器)


