Re: Re: Re: [cpp]请不要再把话题扯回去
李慧霸
magazine.lihuiba at 163.com
Thu Oct 26 22:32:04 CST 2006
>> 假设1:程序代码段内最后一页空余的空间数量在[0,4k]内服从等概率分布,则剩余空间为[0,1k]的概率为0.25。
>数据段和代码段是独立占用内存页的。在这个程序里,无论怎么写,都有一处数据段的数据,而且都不大于 4k 。
是数据段,口误,sorry。
我讨论的是实际程序,而不是测试小程序,数据段、代码段都可能会比较大。
>> 假设2:硬盘的磁头latency在8ms左右,顺序访问延迟忽略不计,io代码执行时间忽略不计,则载入一个page的时间为8ms左右。
>刚才查了一下,现在的硬盘线性读速度约为 40~50M/s 也就是 1ms 可以读 40~50k 数据,不知道载入一个 page 8ms 的假设怎样得到的?
磁头不可能总是等在要加载数据的磁道吧?现在比较好的硬盘的平均寻道时间差不多就是这个8ms了。
>这里讨论的是除法,平均延迟以前讨论过,可以认为是 70 左右。
>整数运算中,乘除法的平均延迟高于加减法一个数量级。不能认为处于同一数量级。
如果连续单纯地执行除法,那么延迟可以是这个数字,但现实肯定不是这样。
对于日常程序,现代CPU的指令级并行技术可以极大地隐藏指令延迟(通过并行),认为70个周期是不合理的,除非有确凿的证据。
>分支预测的正确率不知道 90% 是怎样算出来的? 分支预测的原理就是根据历史的概率统计。如果历史上的数据跳转于不跳转的概率是 50%
>的话,预测正确率也不会超过 50% 。
晕死。分支预测不是简单地根据 同一地址 的 前一次 的结果来推断 这一次 的结果,而是可以根据 同一地址 以前的N次 结果来推断 这次结果。
甚至可以根据 不同地址的 前N次分支情况 推断 这一次的分支情况。
对于日常程序(不是测试小程序),分支预测准确率一般都在90%以上,对于科学计算程序甚至能达到99%,这些数据在来外的名著"computer architecture: a quantitative approach"中有大量的测试数据和详尽的分析。
还有,在有BTB的情况下分支预测成功时的代价可以是-1,就是说不但分支不影响性能,反而会提高速度(在某种意义上)。
>分支预测失败的影响一直是很严重的,翻资料的活我前面已经做的很仔细了。复述一次结论:"超过 100 个周期的延迟并不稀少。通常也会保持在 50
>个周期左右。而且不可能少于24 个"
确实有不少指令的延迟很大,但这些往往都是复杂的浮点操作(如浮点除法、三角函数、开方)、向量访存等,这里并不会涉及这样的指令。
如果有,请举个例子。
早期p4的流水线21级,p4d是30多,而p3、pm、conroe以及amd的cpu好像都是十多级。这些cpu在执行简单指令的时候,流水线不会有环路,所以这些指对不会有那么长的延迟。
>> 从上述分析可以看到,多一次pageout的影响需要 数十万次 查询来抵消,熟轻熟重自见分晓。
>如果你的结论成立,是否可以推导出结论,现代算法设计时,多占用 4k 内存对程序效率的影响,远大于提升指令执行效率?
>(能否量化推导一下,在长期运行的程序中,1k 内存相当于大约多少个时钟周期呢)至少这个结论不符合我的直觉。
我只是拿page fault的损失跟别的相比较而已,当内存足够时候,page fault是很少见的。所以不能推论。
有个什么人曾经说过一句什么不能往前走一步的话。
其实我做这个分析主要是说明pf的性能损失有多大。
我早在对这个问题的第一贴中就说了,速度差异在实际中可以忽略不计的。
>ps. 你原来举例说什么时候可能引起这种情况时,假设的数据数据是 10M ,按 4 字节一组数据数据看,相当于 250 万次查询。似乎
>250 万比数十万这个数字要大上很多呀?
需要的数据并没有说全部都是日期啊,还会有别的。
------------------
李慧霸
2006-10-26
More information about the Cpp
mailing list