动态评率调节
动态频率调节是一种在运行苛刻任务时通过自动提高CPU频率来提高系统性能的技术。Intel CPU的Turbo Boost就是此类。
同步多线程
一个物理核中可以同时执行2个线程。通常,架构状态会被复制成多份,但执行资源(ALU、缓存)不会被复制。
缩放调试器
Linux内核可以基于不同目的控制CPU频率,目的之一是节省电力。
CPU亲和性
处理器亲和性可以将进程绑定在某个CPU核上,在LInux可以使用taskset工具完成该操作。如perf stat -e --taskset -c 0 a.exe命令。
进程优先级
在linux中,可以用nice工具提高进程优先级。 优先级从-20(最高)到19(最低)不等,默认是0。perf stat -r 10 -- sudo nice -n -5 taskset -c 1 a.exe命令。
文件系统缓存
未知迭代次数的循环
循环不会处于完整清晰的状态,向量化程序必须猜测和假设丢失的信息,并在运行时检查详细信息。如果假设证明是错误的,向量化程序将回退到标量循环中。
对于n不是向量宽度的倍数,向量化程序必须将最后几次迭代作为标量代码执行,而保留循环的标量副本会增加代码大小。
运行时指针检查
一些程序员会使用restrict关键字通知编译器指针不连续。不过,有时LLVM循环向量化程序通过放置某些代码来检查两个指针是否指向不连续的内存地址。
规约
循环传递依赖会阻止向量化,但规约变量除外。
If转换
LLVM向量化能够扁平化代码中的if语句,生成单个指令流。
数学函数向量化
LLVM循环向量化内建数学函数。
向量化过程中的部分展开
SLP向量化
Superword-level parallelism, SLP向量化程序试图将多个标量运算黏合在一起,形成向量运算。它自下而上跨多个基本块处理代码,以寻找要组合的标量值。
外循环向量化
CUDA和OpenCL依赖外循环向量化,因为它们指定的迭代在循环外部维度上彼此独立。
跋
1. 硬件性能增长速度在放缓,软件性能调优越来越重要;
2. 有意义的性能分析应该考虑噪声,并使用统计方法来分析性能测量数据;
3. 预测特定代码段的性能几乎是不可能得。一定要测量!
4. 性能调优很难,工程师需要从不同的角度解决问题,需要了解可用的性能分析方法和工具(硬件和软件)。比如屋顶线模型和TMA,利用LBR\PEBS和PT等其他硬件监控功能。
5. 了解应用程序性能的限制因素以及解决相关问题的方法。
6. 如果代码修改的好处可以忽略不计,则应该将代码保持为最简单、干净的形式。