来读一篇早年(September 27, 2017)的文章:The network era requires new models, with interactions instead of algorithms.
这篇文章迟到了很久,我在十多年前提到过一个相关的时空辩证:
- CPU 在时间序顺序执行指令流,基于图灵机模型;
- 专用硬件(or 芯片)将指令在空间展开,并行依赖。
一个有限时间执行完的指令流一定能展开成有限空间里的一堆门电路,如用一个加法器和多次 load/store 完成的多位加法一定能用一个多位加法器等价,前者用时间换空间,后者用空间换时间。
引文中一个图:
大致就是一个组合电路的样子,也阐释了我上面那段话:连续的 A = B + C; Y = X + A 流程被两个独立的 agent 级联等价。
计算机最底层的芯片就是一堆在空间中彼此勾连的门电路,它们之间的依赖关系决定了电路状态转换,一个指令可以在几乎 “一瞬间” 完成,取决于光速,电路尺寸及连接方式。
往上进一层,芯片封装成 CPU,以 CPU 为单位,其上运行的却是串行指令流,于时间序顺序执行,由此我们看到的是一个个用 C,Java 等编程语言写的代码。
再往上,人们又期望这些独立代码可以并行完成一件事,甚至在分布于不同位置的机器上并行完成一件事,愿景又回到了最底层,瞅瞅看,支撑所有这一切的最底层门电路就是分布在不同位置,且它们并行完成了所有这一切。
但指望 C,Java 独立程序做并行计算,将遇到没完没了的同步问题。
坚,柔为辩证,时,空也是,“天下之至柔,驰骋天下之至坚,无有入无间”。这是个圈,但似乎没有闭合。文初引用的文章给了一个闭合的方式。
重新回头审视,可以发现计算范式的不同,同步问题难点的根源在于不理解这两种不同的范式:
- 用串行程序组合并行计算,程序知道变量的位置,却不知道变量何时到达,这就就需要同步;
- 用并行 agent 组合并行计算,agent 知道变量何时到达,却不用知道它来自哪,这就不用同步。
只要变量到达,计算就能继续推进,至于推进到哪里,完全取决于连接方式,而连接方式也决定了变量不可能从多处到达而产生歧义。
…
并行计算同步难是康威定律实例,这个定律说,设计系统的组织,其产生的设计必然是该组织沟通结构的副本。C,Java 程序基本都是模拟 CPU,它们顺理成章顺序执行,没有任何天然机制支撑并行状态同步,程序(or CPU)是独立且封闭的,当它执行时,它就是整个世界,也就必须手工埋点来支撑同步,说回 CPU 本身,多 CPU 的缓存一致性问题也是类似。
是以,“天下有始,以为天下母。既得其母,以知其子。既知其子,复守其母,没身不殆”。
《道德经》还是要一读再读。
早读一篇 acm 文章,发现是 2017 年的,相见恨晚,昨天买了新鞋,再也不用穿着拖鞋跑步,路上思考昨天读到的《道德经》几章节,又想到早些年写的文章,“硬件电路就是以拓扑和通信为核心,并行完成任务,但在上一个芯片的层次,却是在执行串行的指令流”,将这些思考糅合一下,作文以记之。
浙江温州皮鞋湿,下雨进水不会胖。