Re: 答复: 答复: [cpp] 请问一下 如何判断一个8位数是否是有效日期

云风 cloudwu at gmail.com
Fri Oct 13 14:09:26 CST 2006


在 06-10-12,Wu Yongwei<adah at sh163.net> 写道:

> > 如果真的是密集型数据校验。每组数据是 4 个字节,多余出来的 1
> > 级缓存足够满足上万组数据使用了。因为这个任务还快不到内存的吞吐量的极限。
> > 所以在计算数据的时候,缓存已经可以被预读了。
> >
> > "日期检查占掉的CPU时间只占总运行时间的一小部分。" 我不认为成立,毕竟,除
> > 法,判断这些的执行时间远高于加载 cache
> > 。光一个除法的延迟,就足够好几次 cache 行的加载了。
> >
> > 其实更伤害性能是分支,用于分支的 BTB 随着 cpu 的发展越来越昂贵,这绝对是
> > 远超过 cache
> > 的利用问题的。而一张简单的表可以消除不只一次的分支,这样一对比,要廉价的
> > 多。
>
> 这些方面你有数据吗?我以前听说的是,一个除法约七十个时钟周期,但缓冲不命
> 中在最坏情况下可达数百个时钟周期的延迟。分支出问题的原因也是缓存不命中,
> 及流水线中断(对长流水线的P4影响最大);但目前的分支预测算法应该是越来越
> 好了,而且我印象里甚至可以同时预执行多个分支。但我手头没有进一步的资料。
>

整数除法的问题是这样的,各个阶段设计的 cpu
都不太一样。不过从发展历史上来看,是越来越昂贵的。现在的流水线设计已经不能单单以一个延迟时间来参考了。一般说来需要考虑基本的延迟时间,切换运算单元的延迟时间,和重复使用同一个运算子单元的延迟时间。除法在这里不会造成切换运算单元的延迟。如果我们的除法运算不密集的话,第3个延迟也可以避免(在
P4 上是 20 多个,在 Pentium D 上是 30 多个)。基本延迟时间一般在 P4 上是 50~60,Pentium D 上是
70~80 )不过到了 Pentium Core Duo 和 Core 2 以后又降了下来,只要 20~30 了。

分支预测的效率问题主要集中在预测失败。(通常处理循环时,几乎不会失败,所以效率比较高。如果是数学运算,这个问题会突出一些) 早期的 P4
系列,有一个很大的 BTB (8 ways * 512 sets) ,不过分支流水线不能被 cancel,
一旦失败惩罚非常严重。在处理高延迟的指令中,尤其如此,超过 100 个周期的延迟并不稀少。通常也会保持在 50 个周期左右。而且不可能少于
24 个。

后来新的处理器,如 core duo 等,BTB 被减少了,(2 ways * 64 sets) 。不过预测失败的惩罚变小了,只有 15
个周期左右。不过因为 BTB 要小的多,所以能否带来比以往 cpu 架构更高的性能,要看程序的性能热点是否突出。

关于 cache 的延迟,我想问题没有那么严重。比如新的 core 2 的架构,L1 cache 的延迟只有 3 个周期,L2 cache
是 9 个周期。而 L2 cache 是以 M 为单位计算的。我个人认为因为 cache 失效导致的上百周期的延迟非常的稀少。

btw, core 2 上 cache 行现在是 64 字节为单位了。容量是 32k, 每个 core 独有一个。L2 cache 是 share 的。

-- 
http://blog.codingnow.com



More information about the Cpp mailing list