文章目录
一、局限性
编译器 安全 保守
妨碍优化的方面:
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)]