No comment yet
January 15th, 2015

上周和友人聊天的时候,他莫名就提到了少年情怀。快到三十,还一事无成的时候,谈起少年情怀总是有点Pretentious啊。最近的日子过得都太物质,而在十七八岁的时候,这个物质的世界反而不是这么具象。十七八岁的少年,不止有一个物质的世界。虽然对于大部分的少年吧,那个非物质的世界往往就在网吧的屏幕里。但至少在那里,可以打怪升级,耀武扬威。

而我那个时候,是如此内向,只会躲在书里的世界,见到书里水一样的姑娘心脏就扑通扑通乱跳。过去了这些年,看过那么多书,走过那么多路。在台上巧舌如簧,在台下小心导航。结果见到喜欢的姑娘,还是跟十六岁时候的少年一样,拙嘴笨舌,脸红口燥。幸好心里还装着改变世界的小愿望。而那时候的少年啊,就已经穿着中二的校服,跟着师傅除妖降魔,拯救苍生去了。十年过去,苍生还没救到,只是吃了百家饭,穿了百家衣。饱一顿饥一顿的时候,才知道光吃果子会营养不良。醒一分梦一分的时候,才醒悟师傅也喜欢着被菩萨收走的那只小玉兔。到了凌云渡,望见雷音寺,就要功德圆满,又动了凡心。

然后归家路上,看尽了沧海桑田,猛一转过头去,却望着那个姑娘说,红尘真美啊。

No comment yet
January 5th, 2015

一开始抒情,陈升这个男人就在我脑子里开始「依然是,不懂爱也不懂情」。本来说年前的时候写一篇像话的小散文,讲讲现在的乐观情绪。结果一玩起来就没了神,一周什么都没干,就像做梦一样。一年用这样的方式结束总是觉得有点邋遢,跑马拉松的时候,最后一英里就算再累,也要冲过去啊。

去年刚开始的时候,想做的事情才做了一半,安排的事情也都八字没有一撇。却没有任何征兆地,就这样到了年底。

2014年呢:

跑完了一趟50Mi又跑完了一趟250K。

认识了更多有趣的朋友。

读完了四五本书。

从旧金山搬到了洛杉矶。

这样一条一条数下来,却发现和自己期待的差了好多。但是到了这个年纪,也知道好多事情并不是能在一年的时间段完成的。人性的伟大之处,不就在于能够牺牲短期的欢愉,而争取长期的进步吗。

No comment yet
November 28th, 2014

只有一个月就到年底了,一方面蠢蠢地想着年底出去玩,另一方面什么都没做也很慌张!本来说感恩节的时候好好在家工作,结果眨眼功夫,就到了San Diego呆两天。一年时间什么都没干成,还坐在Grand Hyatt楼顶干嘛,早点回去干活才是正事。

故事到最后,都是我想要离开,你却停不下来。

喂,少年,新生活刚开始的时候要勇敢面对啊!

No comment yet
October 20th, 2014

有的时候,两年什么事情也没发生。转眼间,跑第一次马拉松就已经过去了一年,在Mountain View的夏天训练已经是那个夏天而不是这个夏天。但转眼间,很多事情又发生在两周之间,就这样为三十岁收尾了吗?

有时候也会吓一跳午夜冷汗醒来,怕泡沫破灭之后自己一无所有。有时候也会固执地觉得,最后会是Kentucky的某个老太太的养老金来给我们买单。上周末在GSB,就是看看更不靠谱的人怎么为自己找台阶的,也要一边摇头,一边学习学习呢。

无论环境怎么变,还是得慢慢积累,和以前一样好好工作,才会继续有好运呢。能在新的小公寓里望着Bay Bridge,想着还有点小激动。

No comment yet
September 14th, 2014

去年的时候提起Burning Man,有人告诉我:「It is a very spiritual experience.」可是,在沙漠里面一堆人唱歌跳舞又有什么可稀奇的呢。

就算是专业摄像师,人长得丑真没救啊

可是当自己真的到一个没什么人的地方,每天只是跑步,吃饭,睡觉之后,才觉得,真的很Spiritual。

也会担心回家之后成堆的邮件和事情,也会担心赶不上进度。可是在那几天,只有南半球的星星在头顶,太阳和月亮照着前进的道路。自己和自己说话,想着过去的往事,想着未来,想着五年之后,十年之后。想到回到加州之后,夏天就结束了。

自己总是不够努力,懒惰。有事情做的时候不努力向上,没事情做的时候又懈怠。这样的人格硬伤,和不会法语放在一起,真是残疾。

人生的问题,总结下来,无非就是,从约翰内斯堡回来的航班要十六个小时,但是,但是为什么南非航空的航班会有爱情公寓看啊!

No comment yet
August 24th, 2014

而我站在原地。下楼的时候到底是穿短裤还是穿牛仔裤呢,到底是穿T恤还是套个hoodie呢,还没想清楚,晃动就停了。

现在想起来才后怕。四川地震的时候,还能一溜烟地跑到楼底求生。反而6年之后,求生的欲望却没有那么强烈,想的却是只过了三年却多了这么多身外之物,想的却是就这样死去却也不是最坏的结果。最坏的结果不是壮志未酬,而是壮志难酬啊。而是拥有这么多值得期待的品质,却胡吃海花,下半生落魄街头,谁也不认识那个创立了实用主义的人。

就算自己离开家十一年了,也是没办法很好处理各种生活细节。今天整理马上去马达加斯加的背包的时候,把各种食物,分门别类,按照每天的卡路里所需打包起来,贴上小贴士,装得很专业,其实里面的东西,除了方便面,对怎么弄成一顿饭一点头绪也没有。就这么去七天真的没问题吗喂!不会就这么横尸非洲丛林吗!很羡慕那些把生活和工作打理得井井有条的人,而我总是手忙脚乱的狗刨才好歹不被淹死。

过去如胶片般从两侧划过的时候,那些让我从半夜噩梦中惊醒的镜头都纷纷不见,只有那些好多年前的快乐时光,原来还一直存着惦记着,催促着自己穿好衣服,赶紧往楼下跑。

No comment yet
July 3rd, 2014

来耶路撒冷之前,大家都告诉我,这是一个多么特别的地方。总归是半信半疑。来了也就打算去Old City照照破石头,特游客地发发Facebook。谁想到雇了一个这么Hippie的导游,见面就拉着我聊,来来来,我们从Ottoman Empire时候的Zionism谈起!喂!见面就聊这么沉重的话题,我们还能不能好好拍照看石头了!

还能不能拍照看石头了!

穿过巴勒斯坦区,路过以色列的旗帜和梵蒂冈的旗帜,被边警拦着非穆斯林勿入。只能远远地望着Haram al-Sharif,竟然没有缘分见到这么一块石头。

周四,在Western Wall边,一群十三岁少年的Synagogues。小摊小贩叫卖的画里,Dome of the Rock被幻想中的the Third Temple给取代了。这时候,望着墙后面的穹顶再拍照是多么的不合适啊!一个巴勒斯坦的老头走过来,向我们诉说自己被关押了两年半的遭遇。

在加州的时候,耶路撒冷印象中拜Yotam Ottolenghi所赐,就是好吃和各种风情的地方。我哪有准备着来理解为什么亚当出生地的那块石头又凑巧是穆罕默德升天的地方。而这条窄窄的巷子里,为什么耶稣又背着十字架走过,牺牲,死去和重生呢。这么多的故事,都发生在不足一平方公里大的地方。

去特拉维夫的火车上,遇到了一个从挪威到海法朝圣的老人。老人做了一辈子的金匠,却告诉我说现代人的脑子越来越大,心越来越小。

他们说,这都不是宗教的问题,这都是政治。可是那些人,是真的想在死去之前,修好the Third Temple吧。他们靠着墙许愿,明明是那么的认真。

No comment yet
May 16th, 2014

看舌尖才觉得,回家的时候,火锅完全没吃到饱啊。不止是火锅,连早餐的红烧牛肉面都没吃到!有的,是妈妈存的甜柚,冬天风干的香肠和桦树木熏的腊肉。所以就算再节制,不跑步不锻炼的呆一周半,也狠长了几磅的。

十几年前第一次离开故乡的时候,还是十四五岁的小孩,有着青春期的叛逆和心比天高。当时也不会想到,十几年后自己也没什么进步,还在挣扎和学着走路说话。即使自己没进展,也有着奇怪的断层。当朋友们都天各一方,也会有时候分不清家乡的方向。陌生地陪着父母散步几个小时,模糊地记得这里,又不记得那里。找个餐馆都要打开手机地图。

即使这样,当能听着淅淅沥沥的雨声睡觉的时候,故乡始终是心中一块柔软的地方。有小雨,有霜雪,有阴天,也有晴天才是真正的人间啊。在加州的小孩哪能看云识天气知冷暖!但是就算再骄傲,这些儿时习得的小技巧总归长大了都派不上用场,比如泡盒装方便面的时候用里面的叉子把口子给插上,扔纸飞机前先哈口气才飞得远,用注射器吹最大的肥皂泡泡,还有往喜欢的姑娘课桌里使劲地塞苹果。

讽刺的是,对于有些人来说,只有离开故乡,才能找到自己的故乡。

No comment yet
March 31st, 2014

莫名烦躁,书也读不进去的时候,干脆就坐在一旁自己发呆。又到了人生的十字路口,就想起了大学的时候。

大学的时候十分拮据,有时候一天只能吃一个Burrito,看着好的硬件只能眼馋发呆,房租常常上个月接不上下个月。没钱订杂志,也没钱买GPU。

但是大学的时候又很自由,可以自己写自己爱写的东西,成天也没有更多的人生追求。看到一段不为人知的故事,听到一个聪明的解法,就能高兴半天。周四早上买杯咖啡吃个Donut也可以在草坪上坐着看半天书。就连上课也都是好玩的东西。听教授讲各种故事,和大家聊天讨论。无趣的课全都逃掉,把集群上分配的时间全都用光光,还被教授笑眯眯地教训。

自己现在会的三脚猫功夫,动不动就提的two-phase commit,Byzantine failure,全都是那时候试出来的学会的。现在掌握的那些iOS的小技巧,哪有这些名字听起来酷,还有Paxos!

或许清醒的时候我都想不明白自己是有多想回学校整天读书,和土著人一起画画,没事用OpenCL写个比ffmpeg快20倍的Encoder啊。

No comment yet
February 19th, 2014

I was not a fan of low-level parallelism exploitation. The level of parallelism that OpenMP tries is too easy to get wrong. On the other hand, I'd prefer dispatch_apply in any cases for the precise reason to disfavor OpenMP: it is restrictive enough to be only useful for embarrassing parallel problems.

The belief I subscribed to as stated above comes from Amdahl's law; and in my simplified world, the more points you have dispatch / join, the more sequential execution portion you will end up with. Therefore, further limits what you can gain from parallel executions. In the same spirit, I'd prefer long-running processes with limited message-passing at any given time.

It's not just talking points. In past versions of ccv, I never exploited thread-level parallelism to speed up ccv's core functions (SIMD is not in the discussion, it is total awesomeness.) for the simple belief that as long as a given function can finish under a reasonable time, thread-level parallelism should be left for the upper layer of your application stack. When you are running ccv on iOS or Android, even though there are multiple cores, you probably don't want ccv_icf_detect_objects to occupy all of them while executing. On the other hand, if you deploy ccv to a server environment, you probably want to pin process per core, and don't have ccv to over-reaching other cores for parallelism (as hopping could be expensive).

At least that was what I believed until very recently.

Now looking back, the idea of that there exists a right level of parallelism is probably wrong. Until past three or four years, we have a very coarse parallelism levels (I am discounting SIMD again as it is for me a processor hack). We have processes, which can live in remote or local, but any communication between them are done explicitly via messaging. We have threads, which lives locally (or for most of threads), and probably no formal messaging channel; the communications are done implicitly via shared memory and synchronization. Most of the time, register, L1/L2 cache, and memory access latencies are the separated concerns and left for specific optimization. In that pretty coarse world, communications done with shared memory access, which assumes uniform latency, or with messaging, which holds to be expensive (high latency, and the cost of memory copy). The de-facto way to do parallelism in that world, as I previously said, is to go with embarrassing parallelism (avoid communication at all cost, and prefer high throughput / high latency alternatives over low throughput / low latency alternatives) and see how far you can get away with it.

But during the past few years, we have had a much finer-grain parallelism model, which specifies access latency with regards to different parallelism options. Even discounting the rising tide of GPGPU programming, we have much more CPU cores on a single machine (thread + shared memory) and the performance penalty of not aware of the non-uniform memory access pattern will be unforgivable.

I don't have a good plan in mind about how to adapt to this as reality is still very messy. However, there are some interesting observations: 1). in heterogeneous computing environment, we are still playing the old game of balancing out communication cost with computation cost, but in very different ways for different platforms; 2). thus, it is unlikely one well-crafted kernel will perform universally well; include a set of tunable kernels, as the case in libatlas or fftw3 should be the common practice when delivering performance centric software; 3). because it is impossible to have the right level of parallelism, exploit parallelism structure at every level, and let tuners / schedulers to figure out how to adapt to a specific computing environment is the better bet.

It would be quite some fun to experiment how to exploit parallelism at thread-level for functions like ccv_icf_detect_objects / ccv_dpm_detect_objects without exhaust CPU resources on mobile devices with ccv in the future.

‹ Newer