前向兼容手札 头像

消息来源频道

前向兼容手札

@zyf_at_rochester

频道122 位成员公开可见0 人在线

后向兼容什么的,才没人在意呢!

成员规模122 位成员
在线情况0 人在线
消息总数888 条消息
浏览量总数15,140 次浏览

在这个频道里搜索消息……

t.me/zyf_at_rochester

CSAPP 练习题 5.5 实在太震撼了,直接震撼我的计算机观。我的基础太差了,空中楼阁!🤬回炉重学,统统重学!
题目说,poly 是无脑多项式求和,polyh 是著名的 Horner 求和(嘿 11 年前在大学学过,我强选了一门《数值计算》,现在都记得高斯积分)。
无脑:
static double poly(double a[], double x, long degree) {
long i;
double result = a[0];
double xpwr = x;
for (i = 1; i <= degree; i++) {
result += a[i] * xpwr;
xpwr = x * xpwr;
}
return result;
}
霍纳算法:
static double poly(double a[], double x, long degree) {
long i;
double result = a[degree];
for (i = degree-1; i >= 0; i--)
result = a[i] + x*result;
return result;
}
显然 Horner 求和的时间复杂度常数更低,但是书上说在 Intel Core i7 Haswell 上,Horner 比无脑求和慢 60% (8 vs 5)!
我不信,我在本地的 Intel(R) Core(TM) Ultra 7 155U 上测试,gcc 无优化/-O1/-O2/-O3 均是霍纳慢 35% !
原理大家肯定都懂,毕竟只有我是沙堆起城堡,我就讲点大家可能不知道的,我现在假装不知道两个的源码,手上只有两个 elf,用 perf 来观测两者运行的性能差距体现在哪里。
经过我和 GPT-5 的一番肉搏之后,运行下面的命令(其实跳步骤了,先做 TopdownL1 看到是 tma_core_bound,不重要)
sudo taskset -c 0 perf stat -M tma_ports_utilized_2 -M tma_ports_utilized_3m -M tma_retiring -M tma_core_bound -M tma_memory_bound -e cycles,instructions -- ./polyh
两个 elf 的结果作对比 (poly vs polyh,分析过程可能含有事实错误)
1. IPC: 1.69 vs 0.99 出现端倪
2. tma_ports_utilized_3m: 24.2% vs 6.4% 如果懂 ports utilized 3m 是啥意思的看到这就已经懂了,但我不懂🤬
3. UOPS_EXECUTED.CYCLES_GE_3: 104M vs 49M: better overlap
4. EXE_ACTIVITY.EXE_BOUND_0_PORTS: 22.7M vs 41.7M 说明霍纳有更多的 stall
不行我要做锻炼去了,总之就是震撼,我对计算机的理解不足 1%。