Mr Sunshine

Journey of Peace

重读《量化》多处理器章节

一直对多处理器结构一些基本概念和机制认知有些模糊,这阵子终于抽空看了《量化》的相关章节,清晰许多。画了张脑图,总结了多处理器和缓存一致性的基本问题。


书里提到一个常见的认识误区,也是我平时容易忽视的:

用执行速度是否线性提高来衡量多处理器的性能

Measuring performance of multiprocessors by linear speedup versus execution time.

我们经常用同一段代码来比较不同系统的性能,但其实这是不公平的。因为并行版本的程序在单处理器上可能比串行版本要慢得多,相当于你让单处理器去做它不擅长的事情。公平的做法应该是比较各个处理器上各自最优的版本。但其实这样子则会带来算法差异的问题,因为并行版本往往采用针对并行优化过的算法,这样就是拿苹果和橙子比较了。为了区分这两种情况,作者提出相对加速比(relative speedup,用同样的程序测试出来的加速比)和真实加速比(true speedup,分别用各个处理器上最优的程序测试出来的加速比)这两个概念。

另一方面,作者说以是否线性提高来衡量多处理器性能也是不对;不过我觉得作者这一点多虑了。其实我们一般是拿线性提高来衡量系统的伸缩性,这是没有问题的。但是单纯的看核数/处理器数的增加也是不公平的,比如肇国吴总他们当年测COREMU时,就遇到过超线性加速的情况;这是由于当核数增多时,可用的Cashe也变大,提高了缓存命中率从而带来更好的性能。所以在评测中需要综合考虑Cache,I/O等子系统带来的影响。

比较两个处理器之间的加速比并不总能反映它们的相对性能。执行时间变化趋势图可以看,但是要小心别被误导。

另外这篇文章也总结了很多常见的评测和分析的误区,值得一读。


原子指令

还有以前傻傻的老搞不清楚为什么要用exchange这样的指令作为最基本的原子指令,为什么不实现一个锁呢?看书的时候顺便才想明白,其实我们拿锁的过程就是读取和写入锁状态两个动作,一读一写正好就是exchange的语义。由于硬件本身只能实现单独一个读或写操作的原子性,原子指令就是为了解决读写两个动作的原子性这个问题而引入的。

书上介绍的是用特殊的读指令load linked(LL)和写指令store conditional(SC)来实现原子操作。先用LL读取某个地址,在SC要写入值之前,会先检查LL所指向的内存值是否发生改变,是的话则操作失败。这样这一对指令合起来就能实现原子的exchange操作。书里没说LL/SC是怎么实现的,扫了Intel的文档也没看到相关介绍,我猜测应该是这样:LL相当于注册了一个内存监听器,以后执行写操作时,会先检查内存地址是否被LL注册,是的话则置上某个flag;当SC执行时先独占bus,保证没有其他写操作进行,然后检查该flag是否被置上,是的话说明指定的内存被改过了,操作失败,反之则操作成功。

在HP TouchPad上安装Android 4.0

暑假赶上HP挥泪甩卖,拼到TouchPad一只。TouchPad的原生系统是webOS,虽然上面的应用及其稀少,但也有其独到之处:醒目而又不烦人的通知系统,富有操作感的卡片式任务管理,以及对Flash的完美支持。而且在后来的一次版本升级里还加入了一个彩蛋,当你以某一个特定方位查看任务卡片时,往下拉卡片会有弹弓被拉紧的声效,松指让卡片飞出的时候就能听到后面有只愤怒的小鸟也欢乐地“hui”出来。

无奈应用确实少得可怜,前天终于抽空把它刷成webOS和Android双系统。目前移植得比较成功的是CyanogenMod(CM)这个发行版,最新版本是CM9,基于Android 4.0。网上的教程大多很啰嗦,中文的也都还是CM7(Android 2.3)版本,所以简单记录下。我是在Mac OS X 10.7.3下刷机的,Windows和Linux的步骤也都类似。

0. 先下载下面这几个文件/工具:

  • ACMEInstaller2
  • update-cm-9.0.0-RC0-Touchpad-alpha0.6-fullofbugs.zip
  • update-cwm_tenderloin-1012.zip
  • moboot_0.3.5.zip
  • novacom

前四个文件都可以在开发团队的论坛发布贴下载。其中ACMEInstaller2(A CyanogenMod Experimental Installer)是用来将CyanogenMod刷进TouchPad的工具;update-cm这个就是CM(Android)的镜像;update-cwm_tenderloin是一个专门刷Android ROM的工具(ClockworkMod);moboot提供多系统启动的支持。

而最后一个novacom则是HP官方提供的TouchPad驱动和刷机工具,包含在HP webOS SDK里,不过因为整个SDK太大了,有人就专门把这novacom从SDK抽取出来。我一开始试了好几个第三方的novacom都不成功,最后还是装了SDK才认出设备来。

1. 安装novacom

2. 准备刷机文件

让TouchPad以USB drive mode连接电脑,把

  • update-cm-9.0.0-RC0-Touchpad-alpha0.6-fullofbugs.zip
  • update-cwm_tenderloin-1012.zip
  • moboot_0.3.5.zip

这三个文件复制到TouchPad根目录下的cminstall(一定要叫这个名字)这个目录去(需要自己新建目录)。

3. 进入开发模式

重启TouchPad,在屏幕变暗时按住增大音量键(也有说法是要同时按住电源键,不过我只按增大音量键就行了,可能是TouchPad版本问题吧),直到屏幕出现USB连接图示的时候才松手。这时候要等一下让电脑安装驱动。

4. 刷机

在终端执行下面这个命令,其中/path/to/ACMEInstaller2是ACMEInstaller2文件路径

1
novacom boot mem:// < /path/to/ACMEInstaller2

你应该会看到TouchPad屏幕上哗啦啦的一溜输出,等到它完成后会自动重启,这时候TouchPad就已经安装上Android系统了。刷机后启动会先进入moboot的选择启动界面,默认是5秒后进Android,你也可以用音量键上下移动,用菜单键选择启动项。

问题

Q: novacom报failed to connect to server错误。
A: 这个可能是硬件问题,换根USB线,换个电压大点的USB插口;也可能是软件问题,比如novacom没装好,系统没驱动认不出TouchPad来。

Q: Android下连接电脑没法识别出USB存储设备。
A: Settings -> Storage -> 注意到右上角那个小菜单没有 -> USB Settings -> 选上MTP模式。

Q: Mac下还是看不到挂载的USB设备。
A: 装一个Android File Trasfer

Q: 怎么刷完机就充不上电啊!
A: 最近天气冷,把TouchPad丢被窝里暖暖再充。

参考

[1] [Release][Alpha0.6] CyanogenMod 9 Touchpad
[2] How to install Android 4.0 on the HP TouchPad (CyanogenMod 9 Alpha)

博客跟风改用octopress

前几天把博客从WordPress搬到Octopress。为什么要用Octopress以及如何迁移小zp哥的博客基本都讲得差不多了,这里只做点补充。

整个迁移过程很简单:

  • 安装octopress

  • 博文迁移:我用的是小z改进过的migrate.rb

  • 导入评论:原来的WordPress里安装disqus插件,在插件设置里把WordPress评论导进disqus

  • 博客图片:我原来的WordPress博客图片都是用第三方图片存储服务的,所以博客图片也不需要迁移。需要的话直接复制wp-content文件夹就好。

  • 非博文页面(Page):其实第2步可以参考这里提供的其他迁移方式,能把所有页面都同步过来。 我的博客只有一个About页面,就自己重新写写算了。

图片格式

有些博文开头会放插图,比如这篇。我希望这类小幅插图都能被文字环绕显示,这就要为它们定义css style。虽然能直接写html代码,但总觉得难看;好在octopress有一个Image Tag插件,它支持这样的语法:

1
<img class="[class names]" src="/path/to/image" title="[width] [height] [title text [alt text]]" >

所以只要在/sass/custom/_styles.scss里定义好css class,需要的时候直接指定[class name]就行了。

导航栏

rake new_page添加页面之后是不会自动生成导航栏链接的,得手动修改/source/_includes/custom/navigation.html

2月8日更新:

Emacs

我平时一般用的是Emacs,加上这个扩展函数之后可以直接在Emacs里创建博文和部署网站。我修改过Rakefile里的new_postnew_page任务,让它们自动打开Mou编辑新建页面;而在Emacs里执行这两个任务的时候就不需要自动打开Mou,所以在调用rake new_postrake new_page的时候还需要加个开关参数,这是我修改后的扩展

MacBook Air进水遭遇+攻略

前阵子不小心把一整杯水泼到air的键盘上,刚倒下瞬间还没事,结果一慌张又把杯口推到电源附近,当场就自动关机。当时手忙脚乱的,把机器擦干之后就迫不及待的按了电源键,还是没任何反应。后来才知道这是一个很致命的错误,这样子是很容易烧坏主板的。正确的做法应该是:

  • 立刻关机,断开外接电源,能拔电池的赶紧拔电池(air悲剧)。切断电源后至少能保证不会有短路带来的后续伤害。
  • 能拆机器的拆开来,用吹风筒猛吹。有些人说不要用吹风筒吹,可能是考虑到温度过高;其实高级点的吹风筒可以让它吹冷风的,但我觉得应该没啥关系,因为本本工作温度比吹风筒吹出来的风温高多了。这里air再次悲剧了,苹果用的螺丝是专门定制的,得用苹果专用的梅花螺丝刀才能拧开。作为一个自行拆过机的苹果用户,这里我要吐个槽:苹果既然要自己设计螺丝,为什么不干脆做成六角这样不容易滑丝的呢?苹果的梅花螺丝有五个点,每个点都是圆的,这样很难受力,很容易就滑丝。我当时自己拆开装上后,想再拆一次,就发现有一颗螺丝已经滑了,怎么也拧不出来。
  • 如果拆不了机,或者觉得有些地方吹不到,那可以把整只本本插到米堆里搁上几天,觉得不给力可以在米袋里再放点茶叶或干燥剂。

人类为什么需要宽容?

这里的宽容不是讲个人的宽容。个人不宽容只能以大多数人不介意为极限,而官方不宽容则可以权力浩大。宽容如同自由,只是乞求是得不到的,只有永远保持警惕才能保住它。《宽容》讲述的就是千百年来欧洲文明如何在宽容事业上的一点一滴前进的故事。直到现在,“不宽容”仍在向我们进军,我们不能再坐以待毙。虽然历史并不能告诉我们如何建立一个宽容的社会,但至少我们多少可以学到如何避免这些悲剧的发生。

故事从原始时代讲起。原始人把一切事情都归为生灵操纵,为让社会维持下去,就要靠专横的制度,使所有人绝对服从能平息上帝怒火的律法。那时没有军队和警察,靠的是忌讳来保护这些条例。这对他们来说也是理所当然的事。那时候还没有什么宽容的概念。

Hadoop的下一代MapReduce框架

最近雅虎开发者博客发了一篇介绍Hadoop重构计划的文章。他们发现当集群的规模达到4000台机器的时候,Hadoop遭遇到伸缩性的瓶颈。目前Hadoop各个模块的紧耦合使得在现有设计的基础上的继续改进举步维艰。这一点早已在社区内达成共识,目前他们正准备开始对Hadoop进行重构。

新架构的主要思想是把原来JobTracker的功能一分为二:ResourceManager管理资源的分配,ApplicationMaster管理任务监控和调度。ResourceManager与原有的JobTracker类似,作为整个集群的控制中心;而ApplicationMaster则是每个application都有一个单独的实例,application是用户提交的一组任务,它可以由一个或多个job组成。每台slave运行一个NodeManager实例,功能类似于原来的TaskTracker。

Linux全系统复制

千盼万盼,终于盼来实验室的7台R715集群,捣腾了两天好不容易才把机器和交换机都安上机架。机器有点多,我们不想每台机器都重新配置一遍环境,所以准备先配好一台机器再复制到其他机器的硬盘上。

方案1 – 全盘复制

直接复制整个硬盘,这样包括boot loader和分区表在内的硬盘所有信息都能完整的复制过去。不过目标盘的容量不能比复制源低,否则文件系统就悲剧了。这种方法需要拷贝整个硬盘,即使你什么文件也没写,所以速度非常慢。

我们都是意志的奴隶

爱与生的苦恼《爱与生的苦恼》这本书是叔本华的选辑,安排的九篇短文虽然相对独立,但都是围绕着人生、爱欲与生死这一主题。为什么我们活着这么痛苦?为什么我们会有如此强烈的爱欲?为什么我们如此惧怕死亡?这些都是每一个严肃对待生命思考生命的人所会遇到的问题。而在这本书中你会发现叔本华早已敏锐地将这些疑惑和苦恼暴露出来,并用意志的理论诠释了一套完整的世界观和人生观。很多人说叔本华是一个悲观主义者,因为在他看来,人的一生是悲惨的,而且这种悲惨还会在其他的个体上无限地延续下去。而我在读完这本书之后却有一种释然,知悉这种悲惨这种痛苦的根源之后的释然。

20101010101010

没想到还有人记得十几年前四个黄毛小屁孩在龙湖沟畔踢完球一时性起的约定,2010年10月10日早上10点10分10秒,在龙湖沟金砂东路口东侧草坪的榕树下再相会。大家互相想象对方10年后的模样,YY某某人的女友有多漂亮。

如今四人四地,汕头上海,广州杭州,也只能在手机里通通气。

不过想到当时那份纯净无暇的心情,还是挺感动的。汕头的兄弟说他明天还是会去的,儿时的梦总是能打动人心啊。

骑马

端午的那个周末,19号和zr跑去骑马了。我是第一次骑,带教教的是英式骑法,就是直挺挺的很绅士的那种。戴着圆顶黑头盔,套上修长的护腿,看来倒还真像那么回事。