
本文主要介绍过程克隆。实验环境是CentOS7 + GCC。
1. 优化方法简述
过程克隆是指当一个过程在不同的调用环境下表现出的不同特性时根据需要生成该过程的多个实现,再针对每个实现进行不同的优化处理,程序中的调用点会根据上下文的属性信息来选择调用过程实现的某个版本。过程克隆也可以理解为多版本。
2. 示例分析
由于步长大小j的值的不确定,且此语句存在自身到自身的依赖,很难对代码进行向量化。对于某些可以在编译时确定j值的调用点,编译器可以用克隆后的相应版本来替代。假设平台向量寄存器一次可以处理4个整型数据,那么可以把代码改写成基于不同j值的特定版本,因此当j=0或者j>4时调用func2进行向量化优化。其余情况都调用func1。左边给出了func1函数,右边给出了func2函数。示例优化前代码命名为processClone1.cpp,示例优化后代码命名为processClone2.cpp。
编译运行命令:
(1)gcc processClone1.cpp -o processClone1
(2)./processClone1
(3)gcc processClone2.cpp -o processClone2
(4)./processClone2
可以看出,优化后代码的执行时间要比优化前代码的执行时间短,达到了优化的效果。
汇编代码生成命令:
(1)gcc -S processClone1.cpp -o processClone1.s
(2)gcc -S processClone2.cpp -o processClone2.s
3. 总结
与过程内联时将调用点替换为被调过程的副本不同,过程克隆保持实现调用的代码不改变。过程克隆是一个加强常数传播作用非常有效的途径,在原过程的不同克隆版本中,可以将调用发送时不同常数值的参数视为常数。
4. 参考资料
(1)自编教材分享:第六章—程序编写优化(三) - 哔哩哔哩 (bilibili.com)
(2)编译器常用的8种优化方法 - 知乎 (zhihu.com)