文章目录
一、局限性
编译器 安全 保守
妨碍优化的方面:
1、内存别名使用
多个指针指向同一个地址
2、函数调用
编译器不优化防止全局变量产生影响
程序性能评价 CPE
二、循环的优化
1、代码移动

2、减少过程调用
将重复调用的过程移动到循环外
3.消除不必要的内存引用

三、现代处理器优化策略
核心: 指令级并行
延迟界限:下一条指令前执行完
吞吐量界限:计算单元限x制
1、整体操作
(超标量)乱序并行
2.功能单元的性能
延迟:完成运算的时间
发射时间:两个连续同类型运算之间的最小间隔周期
容量:能够执行该运算的功能单元个数(同时能发射多少个)

3、循环展开
(1)一次运行两个

2*1
void unroll2a_combine(vec_ptr v, data_t *dest)
{
//循环展开,由于加载单元只有两个
//两两展开
/* Combine 2 elements at a time */
for (i = 0; i < limit; i+=2) {
x = (x OP d[i]) OP d[i+1];
}
//剩下一个
for (; i < length; i++) {
x = x OP d[i];
}*dest = x;
}

(2)重新组合
2*a
void unroll2aa_combine(vec_ptr v, data_t *dest) {
/* Combine 2 elements at a time */
for (i = 0; i < limit; i+=2) {
x = x OP (d[i] OP d[i+1]); }//
/* Finish any remaining elements */
for (; i < length; i++) {
x = x OP d[i];
}*dest = x;
}

(3)两个负载单元
/* Combine 2 elements at a time */
for (i = 0; i < limit; i+=2) {
x0 = x0 OP d[i];
x1 = x1 OP d[i+1];
}
/* Finish any remaining elements */
for (; i < length; i++) {
x0 = x0 OP d[i];
}
*dest = x0 OP x1;


i];
}
*dest = x0 OP x1;
[外链图片转存中...(img-1UwBRh3H-1650973951342)]
[外链图片转存中...(img-s64S2DiK-1650973951343)]
本文探讨了编译器在内存别名和函数调用上的限制,以及如何通过代码移动、减少过程调用和循环展开来优化循环性能。深入剖析现代处理器的优化策略,如指令级并行、功能单元性能和循环展开技巧,特别关注了利用两个负载单元的优化实例。
7391

被折叠的 条评论
为什么被折叠?



