世间本无事,佣人自扰之

南,北桥

08月 25th, 2005 by solarsea

    没记错的话,这个是去年VIA的一道笔试题,当时师兄拿这个题问我来着,当时答得好像是,北桥MCH,memory controller hub 内存控制集线器,南桥ICH,I/O controller hub 输入输出控制集线器,自己顾名思义吧,答得真够含糊的,hoho。下午在网上无意看到一个讲得还算详细的版本,嗯,做一些删节,留下,以备不测。
    主板上通常会有两块比较大的芯片,一般将靠近CPU的那块称为北桥,远离CPU的称为南桥。北桥的作用是在CPU与内存、显卡之间建立通信接口,它们与北
桥连接的带宽大小很大程度上决定着内存与显卡效能的大小。南桥是负责计算机的I/O设备、PCI设备和硬盘,对带宽的要求,相比较北桥而言,是要小一些
的。而南北桥之间的连接带宽一般就称为南北桥带宽
    北桥芯片(North
Bridge)是主板芯片组中起主导作用的最重要的组成部分,也称为主桥(Host
Bridge)。一般来说,芯片组的名称就是以北桥芯片的名称来命名的,例如英特尔
845E芯片组的北桥芯片是82845E,875P芯片组的北桥芯片是82875P等等。北桥芯片负责与CPU的联系并控制内存、AGP、PCI数据在北
桥内部传输,提供对CPU的类型和主频、系统的前端总线频率、内存的类型(SDRAM,DDR
SDRAM以及RDRAM等等)和最大容量、ISA/PCI/AGP插槽、ECC纠错等支持,整合型芯片组的北桥芯片还集成了显示核心。北桥芯片就是主板
上离CPU最近的芯片,这主要是考虑到北桥芯片与处理器之间的通信最密切,为了提高通信性能而缩短传输距离。因为北桥芯片的数据处理量非常大,发热量也越
来越大,所以现在的北桥芯片都覆盖着散热片用来加强北桥芯片的散热,有些主板的北桥芯片还会配合风扇进行散热。因为北桥芯片的主要功能是控制内存,而内存
标准与处理器一样变化比较频繁,所以不同芯片组中北桥芯片是肯定不同的,当然这并不是说所采用的内存技术就完全不一样,而是不同的芯片组北桥芯片间肯定在
一些地方有差别。  
     南桥芯片(South
Bridge)是主板芯片组的重要组成部分,一般位于主板上离CPU插槽较远的下方,PCI插槽的附近,这种布局是考虑到它所连接的I/O总线较多,离处
理器远一点有利于布线。相对于北桥芯片来说,其数据处理量并不算大,所以南桥芯片一般都没有覆盖散热片。南桥芯片不与处理器直接相连,而是通过一定的方式
(不同厂商各种芯片组有所不同,例如英特尔的英特尔Hub
Architecture以及SIS的Multi-Threaded“妙渠”)与北桥芯片相连。
  南桥芯片负责I/O总线之间的通信,如PCI
总线、USB、LAN、ATA、SATA、音频控制器、键盘控制器、实时时钟控制器、高级电源管理等,这些技术一般相对来说比较稳定,所以不同芯片组中可
能南桥芯片是一样的,不同的只是北桥芯片。所以现在主板芯片组中北桥芯片的数量要远远多于南桥芯片。

Posted in 他山之石, 学海无涯 | No Comments

Duff’s Device

08月 24th, 2005 by solarsea

    早上在CPlusPlus版看到这么一个帖,“一道面试题,switch的变态语法”,该帖内容如下:
http://www.newsmth.net/bbstcon.php?board=CPlusPlus&gid=122076
发信人: ajaxchelsea (切尔斯基), 信区: CPlusPlus
标  题: 一道面试题,switch的变态语法
发信站: 水木社区 (Tue Aug 23 21:11:37 2005), 站内
/* 
 *  让你猜猜下面这个函数是干嘛的
 *  幸亏俺常在水木漂,不受“语法臭蛋”影响
 *  一下就猜出这是strcpy,呵呵
 */

void foo(char* a, char* b, int len){
        switch(len & 7) {
        default:
                while (len > 7) {
                        len -= 8;
                        *b++ = *a++;
                case 7:*b++ = *a++;
                case 6:*b++ = *a++;
                case 5:*b++ = *a++;
                case 4:*b++ = *a++;
                case 3:*b++ = *a++;
                case 2:*b++ = *a++;
                case 1:*b++ = *a++;
                }
        }
}

    后边有人指出是Duff’s device,于是去google了一下,Duff本人原话如下:
http://www.lysator.liu.se/c/duffs-device.html

From research!ucbvax!dagobah!td  Sun Nov 13 07:35:46
1983
Received: by ucbvax.ARPA (4.16/4.13)  id AA18997; Sun, 13 Nov
83 07:35:46 pst
Received: by dagobah.LFL (4.6/4.6b)  id AA01034;
Thu, 10 Nov 83 17:57:56 PST
Date: Thu, 10 Nov 83 17:57:56 PST
From: ucbvax!dagobah!td (Tom Duff)
Message-Id:
<8311110157.AA01034@dagobah.LFL>
To: ucbvax!decvax!hcr!rrg, ucbvax!ihnp4!hcr!rrg, ucbvax!research!dmr, ucbvax!research!rob

Consider the following routine, abstracted from code which copies an array of
shorts into the Programmed IO data register of an Evans & Sutherland Picture
System II:

	send(to, from, count)	register short *to, *from;	register count;	{		do			*to = *from++;		while(--count>0);	}

(Obviously, this fails if the count is zero.)
The VAX C compiler compiles
the loop into 2 instructions (a movw and a sobleq,
I think.)  As it
turns out, this loop was the bottleneck in a real-time animation playback
program which ran too slowly by about 50%.  The standard way to get
more speed out of something like this is to unwind the loop a few times,
decreasing the number of sobleqs.  When you do that, you wind up with a
leftover partial loop.  I usually handle this in C with a switch that
indexes a list of copies of the original loop body.  Of course, if I
were writing assembly language code, I’d just jump into the middle of the
unwound loop to deal with the leftovers.  Thinking about this yesterday, the following implementation occurred to me:

	send(to, from, count)	register short *to, *from;	register count;	{		register n=(count+7)/8;		switch(count%8){		case 0:	do{	*to = *from++;		case 7:		*to = *from++;		case 6:		*to = *from++;		case 5:		*to = *from++;		case 4:		*to = *from++;		case 3:		*to = *from++;		case 2:		*to = *from++;		case 1:		*to = *from++;			}while(--n>0);		}	}

Disgusting, no?  But it compiles and runs just fine.  I
feel a combination of pride and revulsion at this discovery.  If no
one’s thought of it before, I think I’ll name it after myself.

It amazes me that after 10 years of writing C there are still little corners
that I haven’t explored fully.  (Actually, I have another revolting way
to use switches to implement interrupt driven state machines but it’s too horrid
to go into.)

Many people (even bwk?) have said that
the worst feature of C is that switches don’t break automatically before each
case label.  This code forms some sort of argument in that debate, but
I’m not sure whether it’s for or against.

yrs trly
Tom

    仔细读了一下上面的文字,并参考了CSDN-文档中心-其它编程语言- 泛型<编程>:类型化缓存(II)http://dev.csdn.net/article/28/28875.shtm,得出结论如下:Duff’s Device可以算作一种loop unrolling方法吧,巧妙利用了switch和while的嵌套,不使用break语句,简单漂亮地解决了边界条件的问题,提高了执行效率。因为减少了7/8的比较判断,因此在循环次数不大的情况下,可以节省很多时间。我们通过检查现代PC的架构来寻找这个现象的解释。处理器比主内存总线快5-10倍。为了加速内存访问有二级缓存。一级在处理器内(1级),另一级在处理器边上(在奔腾三中和处理器封装在一起)最好情况是,一个操作的所有需要处理的内存都在1级缓存内。最坏情况是,你进行随机分散的内存存取操作,这样你总是不能命中缓存,最终都命中了主内存。当填充大量数据时,你不能从缓存中得益,所以填充速度会主要被限定在主内存带宽上。你对循环本身作的优化不能带来很大提高,因为瓶颈在内存,而不是处理器操作。不管你写的循环有多聪明,使用寄存器,或不展开循环,处理器总是会等待主内存。这是为什么Duff’s
Device和for循环对大内存块表现一样。 当填充较少量数据时情况起了变化。数据有更多可能被放在缓存内,而缓存和处理器一样快。现在,处理器执行的代码决定了循环的速度。Duff’s
Device比for循环有优势,因为它执行了较少比较。
    当然上文也指出,标准库函数memcpy使用了特殊的循环汇编语句(x86中的术语是rep stos)。对于缓存到缓存拷贝,这种汇编语句比建立在跳转(jump),赋值和比较基础上的循环要快。因此连续内存的拷贝显然还是memcpy效率最高。但如果是循环赋值的话,Duff’s Device要比单纯循环速度快。
    另外,上文中也给出了各种编译器下的memcpy, 普通循环和Duff’s Device的效率只比。但是自己还是很好奇,于是写了一段代码实际测试了一下。功能只是拷贝一段连续数据,仅比较了普通循环和Duff’s Device。完了之后用Trimedia的tmsim仿真了一下,(本来想用quantify测一下,不知道为啥,一用俺的机子就慢的不行,一动不动,只好放弃),数据如下:
    拷贝数据长度     100,000bytes               1000bytes
    普通循环           639494cycles                 6091cycles
    Diff’s Device     464751cycles                4689cycles
比例和在代码中用clock()函数测得的结果差不多,接近提高25%的效率。数据长度增加100倍,好像也没太大影响,不知道为啥。但结果是肯定的,Duff’s Device确实要快不少。
     看了一下,Tom Duff发现这个算法的时候是1983年,嗯,那时候俺差不多快两岁了…长见识了。
     做完这些,又在joke版看了一个有关“韩国的排骨有多贵”的帖,差点儿没笑翻了,还以为韩剧里主角容易得个白血病啥的,是因为泡菜吃太多,原来他们根本是啥都吃不着,还嘲笑我们中餐不好吃,推荐mms去韩国减肥,哈哈。http://www.newsmth.net/bbscon.php?board=Joke&id=261783

Posted in 他山之石, 学海无涯 | No Comments

不积跬步,无以至千里

08月 22nd, 2005 by solarsea

    转眼回学校一周啦,但是觉得不太对劲,不是说身体,身体现在已经全恢复了,而是精神上,集中不了精力的说。
    第一天去实验室时还好,计划了一下最近一阵子该做的事儿,另外把要做的算法仔细考虑了一下,整理了一下思路,然后还写了2,3百行代码。但是第二天就突然没有这种劲头了,不知道为啥,突然就啥都看不进去了,郁闷,连续几天都在看新闻或者在水木潜水。周末去练了一次跆拳道,好久没运动了,加上这次教练给的运动量比价大,当时就觉得累,睡了一觉起来还浑身疼,尤其是韧带,三个礼拜没有拉,又回去了,sigh。
    本来想今天开始专心做事儿的,早上去了,因为实验室刚装修完,大家又花了一个早上做清洁,楼道里还在喷漆,气味也挺重的,结果一下午也浪费了,李老师中间过来的时候,装模作样的写了几行代码,然后又去看joke了。自己都有点儿受不了自己了,咋还不如去年的这个时候呢?想想去年从7月到12月之间,看了不少资料,也学了不少东西,好像每天都很有精神的说,今年怎么这么浑浑噩噩的呢。还说回学校要整理一下暑假看的论文的内容,结果啥也没干,555。
    MS这样下去不行啊,不知道心理学上是不是有什么自我激励法,可以用一下,呵呵。不过还好,俺从来是比较自觉的,属于能够控制自己的理智型的,只要能过认识到问题的严重性,就能调动好积极性。
    不积跬步,无以至千里;不积小流,无以成江海。嗯,自己激励自己一下吧,快快调整过来。

Posted in 信手涂鸦 | No Comments

贝鲁斯科尼杯-米兰逆转擒尤文

08月 15th, 2005 by solarsea

    新浪体育讯 北京时间8月15日2时45分(意大利当地时间14日20时45分),在圣西罗球场开始的第15届贝鲁斯科尼杯赛中,AC米兰2比1击败尤文图斯。维埃拉首开纪录,但卡卡与塞尔吉尼奥的进球帮助主队反败为胜。此外,伊布拉希莫维奇与科斯塔还射中门柱。内德维德与布冯先后因伤下场。

  贝鲁斯科尼杯创办于1991年,以意大利总理贝鲁斯科尼父亲的名字命名,除1992至1994年AC米兰的对手分别是国际米兰、皇马、拜仁以外,其他各届均是AC米兰与尤文交锋,因此贝鲁斯科尼杯已成为两队间的传统热身赛,尤文此前8次夺冠,占有明显优势。过去,该项赛事的夺冠者往往在随后那个赛季无缘联赛冠军,但去年夺冠的尤文已打破了这一“魔咒”。

  自5月8日联赛交锋以来,AC米兰与尤文只在TIM三角赛上交手了45分钟。双方都排出最强阵容,安切洛蒂在左前卫位置使用了安布罗西尼。维埃里首次身披AC米兰战袍亮相圣西罗,对阵老东家。皮耶罗虽然重回国家队,却无法从卡佩罗这里得到首发机会,内德维德出现在右前卫位置。

  开场7分钟,维埃拉巧妙直传,伊布劲射打在迪达鼻子上弹出底线。第13分钟,卡福传球,维埃里突破图拉姆,但他准备射门时,前国米队友卡纳瓦罗飞身破坏。第18分钟,内德维德被马尔蒂尼放倒左脚踝扭伤,被担架抬出场外,穆图替补出场。

  第19分钟,泽比纳中路直传,特雷泽盖在身后斯塔姆的贴身紧逼下,只得又将球铲回给泽比纳,泽比纳左脚直塞给插入空档的维埃拉,维埃拉反越位单挑迪达,在门前12米处右脚吊射入右上角,尤文1比0领先。

  第28分钟,穆图左路似传似射,迪达脱手后将球拿到。第30分钟,马尔蒂尼对伊布犯规,被黄牌警告。第32分钟,伊布突破两名后卫的包夹,在身体即将失去平衡的情况下,禁区边缘左脚推射击中右门柱,安布罗西尼在混战中解围。此后,伊布门前头球蹭高。

  第36分钟,米兰得到扳平机会,但卡卡在禁区边缘的射门稍稍偏出。第38分钟,穆图传球,伊布甩开马尔蒂尼的盯防,但他的头球高出了横梁。此后,卡卡在门前17米处右脚低射,布冯倒地没碰到球,但球紧贴左门柱而出。接着,卡卡在门前20米处右脚推射,布冯向左侧扑封出底线。上半时结束前,卡卡又有一脚射门被挡出。

  中场休息后,安切洛蒂换上内斯塔、卡拉泽、西多夫与吉拉迪诺,卡佩罗则没有换人。第48分钟,穆图主罚任意球被人墙挡出。第49分钟,西多夫传球,吉拉迪诺将球打进,但被判越位在先。第52分钟,西多夫中路分球,舍瓦禁区右侧回扣闪开后卫,然后低传到后门柱,卡卡在门前13米处右脚推射右下角得分,AC米兰1比1扳平。

  第56分钟,卡卡接舍瓦直传突入禁区,想用右脚扣过出击的布冯,布冯倒地扑救与卡卡腿部相撞,可能导致了右肩脱臼,被担架抬下送往医院接受检查,奇门蒂替补出场,虽然布冯的伤势还未明确,但有可能缺席本周三意大利队客场对爱尔兰的热身赛,里皮已经召入了瓜达尔本顶替布冯的空缺。

  皮耶罗换下伊布。第66分钟,热身赛阶段表现出色的科斯塔传球,吉拉迪诺射门紧贴左门柱而出。第72分钟,皮尔洛与科斯塔打出三角配合,皮尔洛禁区前沿巧妙搓出过顶球,科斯塔在禁区右侧距门7米处右脚小角度凌空抽射击中近门柱。第77分钟,科斯塔中圈50米长传,塞尔吉尼奥左路卸球切入禁区,左脚小角度凌空抽射入网,AC米兰2比1反超。

  AC米兰(4-3-1-2):迪达/卡福,斯塔姆,马尔蒂尼(46′内斯塔),扬库洛夫斯基(46′卡拉泽)/加图索(46′西多夫),皮尔洛,安布罗西尼/卡卡(62′科斯塔)/维埃里(46′吉拉迪诺),舍甫琴科(73′塞尔吉尼奥)。

  尤文图斯(4-4-2):布冯(57′奇门蒂)/泽比纳(52′布拉西),佩索托,图拉姆(59′科瓦奇),卡纳瓦罗,赞布罗塔/内德维德(18′穆图),埃莫森(69′詹尼凯达),维埃拉,佩索托/特雷泽盖(69′萨拉耶塔),伊布拉希莫维奇(57′皮耶罗)。

Posted in 未分类 | No Comments

Birthday is coming.

08月 11th, 2005 by solarsea

    再过一小时,就又大了一岁啦,想想还是一事无成,心里有愧啊。两年过去了,仔细想想,在bupt这两年,其实还是学到了不少东西,从能力来说,比刚从tju毕业的时候还是提高了不少。不过,浪费的时间和精力也真不少,再有两个月该找工作了,因为专业方向的缘故,心里稍微有点儿忐忑,不知道会落得什么结局。不过想太多也没用,后边两个月的时间,抓紧的话,还能学不少东西,船到桥头自然直吧。

    其实内心深处似乎还有一种对学问的渴望,但是错过了直博的机会,就不再想这些了,也到了该毕业挣钱的年龄了。明年的这个时候就不是学生啦。

    回家两个礼拜,啥也没干,光看电视和睡觉了,好在把带回来的那本博士论文看完了,有了不少收获,回学校好好整理一下。目前为止,增重了3.5kg,嗯,很有成就感,hoho。收拾东西,周日就回北京了。

Posted in 信手涂鸦 | No Comments

公车遭遇自杀性爆炸

08月 8th, 2005 by solarsea

   下午无聊,在家里看《红楼梦》,结果父母下班回来开始讨论下午发生的公车爆炸事件,说死了几个人,ft,社会主义也能发生这样的事儿阿。赶紧打开电视看新闻,福建4频道的“现场”报道了,下午一辆5路公共汽车在东街口附近遭遇自杀性爆炸袭击,造成汽车损坏,另外有1人死亡,30余人受伤。据悉,死者很有可能就是爆炸的实施者,初步调查该死者患有肺癌晚期,晕,看来是一起报复社会的行为吧。发生这种事件,不知道政府会有什么反应,总得给可怜的福州老百姓一个说法吧,要不然大家都不敢上街了。

     回家这些天,就有一晚,下了点儿小雨,台风麦莎没有在福建登陆,天气仍旧炎热,都没怎么出门。事发地点ms离一中不远,还好没到学校附近溜达,这种事情,还是少发生为好。

Posted in 信手涂鸦 | No Comments

听说北京下雨了

08月 3rd, 2005 by solarsea

    在新闻里看的,说还下的很大,爽阿。自从回福州以来,还没下过雨呢,每天的最高温总是37度,好在在家里开着空调也就不觉得热了,过两天,下一号台风就要来啦,赶紧下点儿雨吧。

    这两天吃了一些化痰的中药,然后基本没有吃凉的水果,想吃的时候就吃龙眼,身体感觉好多了,看来在回学校之前是可以完全康复的。

    在家有点儿无聊,电视节目没什么可看的,除了新闻和体育直播。只好看dvd了,还好家里还有几十张碟,虽然都看过了,复习一下好了,熟的片子英文字幕或者不要字幕就相当于重看了,呵呵。

    每晚睡觉前在看郭晓强师兄的论文,其中不少是和trimedia的硬件设计和优化有关的,因为我们的板子和他们的差不太多,优化部分自己也做过,所以这一部分就比较熟悉了。算法部分,有些原来也看过,但是时间久了印象不深了,另外他自己也对算法的实现作了改进,这里需要细致一点,但是忘了把264标准拷回来了,晕死。

    Expert C Programming翻了几页,但是CRT显示器看着实在不爽,一会儿眼睛就疼了,还是回学校再抓紧时间看吧。

Posted in 信手涂鸦 | 1 Comment

登录 | 访问数284866 | 水木BLOG | 水木社区 | 关于我们 | Blog论坛 | 法律声明 | 隐私权保护 | 京ICP证050249号
水木社区Blog系统是基于KBS系统WordPress MU架构的