自编教材实操课程分享:第五章—循环剥离
先进编译实验室
2024年04月09日 08:00
收录于文集
共28篇


本文主要介绍循环剥离部分。实验环境是CentOS7 + LLVM。

1. 优化方法简述

循环剥离(loop peeling)用于将循环中数据首地址不对齐的引用,以及循环末尾不够装载到一个向量寄存器的数据剥离出来,使剩余数据满足向量化对齐的要求。

LLVM编译器中,循环展开优化通常与循环剥离配合使用。循环剥离的相关编译选项如下所示:

(1)-mllvm -unroll-peel-count=<参数>:指定循环剥离计数

通过-unroll-peel-count 参数写定数值,编译器会按照该数值剥离循环;若未指定该值,则会在循环展开优化遍中计算循环剥离的值。

(2)LLVM中,循环剥离主要被循环展开优化调用,因此可以加入以下选项:

-Rpass=loop-unroll:显示循环剥离优化相关的信息

-Rpass-missed=loop-unroll:显示循环剥离优化失败的相关信息

2. 示例分析

示例代码如下所示,将其命名为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

可以看出,循环剥离优化前后,得到的计算结果都是一样的,但是经过循环剥离优化后,程序的执行时间明显要比优化前的执行时间短,达到了优化的效果。

3. 总结

循环剥离也是常见的循环优化方法之一。循环剥离用于将循环中数据首地址不对齐的引用,以及循环末尾不够装载到一个向量寄存器的数据剥离出来,使剩余数据满足向量化对齐的要求。优化人员需要根据实际情况选择打开或关闭循环剥离功能。

4. 参考资料

(1)CUDA 学习(十九)、优化策略4:线程使用、计算和分支_cuda分支-CSDN博客

(2)循环优化 (Oracle Solaris Studio 12.2:性能分析器)