道家的思想可谓博大精深,“老子”的《道德经》成为翻译为外国文字最多的中国书籍,同时也是世界上翻译成外国文字第二多的书籍,仅次于圣经。要知道,《圣经》子所以成为翻译成外国文字第一多的书籍,是因为有10多亿的基督教徒。不要说在国外,即使在中国国内,现在也没有多少道教徒,道家的思想却能在世界上流传如此之广,实在让人觉得是“玄之又玄”。
也许有人会纳闷,“老子”为道家思想的创始人,生活于春秋末期,那时不要说计算机,连能用来进行手工计算的草稿纸都没有发明,怎么会成为了伟大的多核计算科学家呢?这该不会是瞎忽悠人吧。
我要说的是,这决不是瞎忽悠人。虽然“老子”所处的时代没有计算机,但是它提出的道家思想中,蕴含了现代多核计算的一些基本原理和思想在内。从这个角度讲,“老子”确实是一位伟大的多核计算科学家。
道家的思想中,无非就是“无为”、“小国寡民”、“大智若愚”、“大巧若拙”、“大音希声”、信言不美、美言不信、…等各种思想。这些思想普遍都认为是一些哲学思想,这和作为科学的多核计算看上去好像是风牛马不及的事啊!老子又怎么能成为科学家呢?难道道家思想里真的蕴含了我们所不知道的多核计算原理和思想在里面?
没错,道家思想里确实蕴含了现代多核计算的原理和思想在内。当然,这不是说白话,得拿出实际证据来证明它才行。下面就以一些多核计算方面的实例来论证道家思想中蕴含的深刻思想,从中也许可以窥见它的“众妙之门”中的冰山一角。
不妨先从“小国寡民”思想说起,“小国寡民”历来被看成是近似乌托帮式的无法实现的理想,在人类社会史中,好像还没有见过那朝那代实现过这个理想。更有人认为这是一个不切实际的想法,甚至认为是错误的思想。可喜的是,这个理想不仅非常正确,而且现在在多核计算中变成了现实,也就是说它得到了科学的证实。下面以多核中查找设计思想和“小国寡民”思想来作一番比较,以窥其中的奥妙。
“多核查找-顺序查找也疯狂”一文介绍了多核查找设计的基本思想,其基本思路是为了避免其中式锁竞争导致的串行化执行,必须将一个大的查找数据结构拆分成多个独立的小的子数据结构,然后给每个小的子数据结构加一把锁,这个当多个线程访问不同的子数据结构时,就不会出现锁竞争现象。“小国寡民”思想是在一个大国中,许多分解成许多独立的小国,这可以说和多核中查找设计的思路是一模一样的。
不妨再回顾一下《道德经》中第八十章中关于小国寡民的原文描述:
“小国寡民;使有什伯之器,而不用;使民重死,而不远徙;虽有舟舆,无所乘之;虽有甲兵,无所陈之;使民复结绳,而用之。至治之极民各甘其食,美其服,安其俗,乐其业。邻国相望,鸡犬之声相闻,民至老死,不相往来。”
先看最后一句,“邻国相望,鸡犬之声相闻,民至老死,不相往来。”,这也就是说各个小国都是独立的,并且由于不能相往来,相当于每个小国都有一把“锁”,这和多核查找中的各个子数据结构都加了一把锁的场景是一样的。
再看第一句“小国寡民;使有什伯之器,而不用;使民重死,而不远徙;虽有舟舆,无所乘之;虽有甲兵,无所陈之;使民复结绳,而用之。”,这是最容易被人产生误解的一句话,许多人认为老子想把人民倒退回结绳而治的原始状态,是一种愚民思想。事实上这些人根本没有理解透这句话中包含的深刻思想。普通老百姓都知道有先进的工具和技术却不使用,却要倒退回结绳而治的状态是一种倒退,除非发了疯才会这么做。
“老子”是不是疯子?当然不是,不仅不是,而且老子比他同时代的人要聪明得多。正所谓“大智若愚”,老子一生中遇到过许多聪明人,包括儒家创始人孔子也曾向老子请教过,然而老子却发现没有一个人能理解他的思想,最后只好“骑青牛,出函关”。
没有人能理解是很正常的,要是那个时代就有人能理解老子的思想的话,那么本文的标题只能改为“老子是一位多核计算学科学家”,万万不敢将“伟大”二字贯在前面的。之所以没有人能理解老子的思想,正是因为其中蕴含了深刻的多核计算思想在内。这句话如果和多核的查找对照起来进行解释,我们就能发现“老子”的真正伟大之处。下面就来看看“老子”到底伟大在什么地方。
让“小国寡民”倒退回结绳而治的原始状态,反映到多核查找中就是让小的子数据结构采用最原始、最简单的数据结构和算法。最原始的数据结构是什么?当然是数组。那么在数组中如何进行查找呢?我们都知道在有序数组采用二分查找是很快速的,然而二分查找并不是最原始的查找方法,最原始的查找方法是顺序查找。也就是说在数组中不要用二分查找,只能用顺序查找。写到这里,可能就会有人有疑问了,不用高效的二分查找,却去用原始落后的顺序查找,不会有病吧,这也能体现出“老子”的伟大来?
我要说的是,用看似原始落后的东西来替代貌似先进的东西正是老子的伟大之处。为什么这样说呢?首先我们看看前提条件:“小国”,反映到多核查找中就是数组要足够小。在一个很小的数组中进行查找,比如只有少数几个数据的数组中进行查找,用顺序查找更好还是用二分查找更好呢?显然稍有编程常识的人都知道,二分查找时虽然比较次数少一些,但是由于它要计算中间数据的下标位置,需要进行加法和除以2的计算,存在计算开销,计算速度可能会比顺序查找更慢。从软件的稳定性方面来讲,编写一个顺序查找程序非常简单,不易出错,而编写一个二分查找程序就没有那么容易了。不妨看看“90%程序员写不出无BUG的二分查找程序?”这篇文章,就知道写一个二分查找程序的难度了,这么难写的程序能保证软件的稳定性吗?要知道,道家思想中还蕴含了软件中的稳定可靠性思想,有兴趣的不妨看这篇文章:“道家·老子的算法思想分析”。再者写一个复杂度高的程序,开发和测试工作量增加了多少啊。
写到这里,相信许多人已经窥破了“小国寡民”的妙处,不会再简单的认为它是一种愚民思想。我们也不得不由衷地钦佩和敬仰生活比我们早2500多年的“老子”,在那么原始的年代,“老子”就窥破了“众妙之门”,道家思想之高深,由此可见一斑。由于实在找不到什么好的用词来形容道家思想的高深和玄妙,只能慨叹一声:“道、可道,非常道”。
前面的“小国寡民”思想的分析,只是道家思想的冰山一角。不妨再将道家的“无为”思想和多核计算方面的实例联系起来进行分析,看看它们之间是否有什么相似之处。
道家的“无为”,追求的是一种顺应自然的思想,这种思想的详细阐述无须我多言,网上可以找出一大堆历史典籍。所谓“大道自然”,即做事需要使用自然的力量,不要去强求使用一些人为的力量。
自然赋给了我们人类什么力量呢?“贪心”、“自私”、“偷窃”等都是自然赋给人类的自然力量,当然自然还赋给了人类很多自然力量,本文只讨论“贪心”、“自私”、“偷窃”这三种自然力量。把道家的“无为”思想应用到多核计算上,也就是说要用自然的力量来设计多核算法,令人惊讶的是,“贪心”、“自私”、“偷窃”正是用来设计多核算法的最有效的自然力量。下面以一些实例来说明它。
先说说“贪心”,儒家认为“人之初,性本善”,西方观点则认为“人之初,性本恶”。其实,人之初是没有所谓善恶的,善恶是人类后天形成的东西,自然界给予人类的自然力量是没有所谓的善恶之分的。所谓善恶皆因贪,也许说成“人之初,性本贪”更恰当。所以可以认为“贪心”是自然赋给人的一种自然力量。
有过算法经验的人都知道,单核时代,“贪心”就是算法设计的一种普遍性的最优策略,特别是对于一些NP难题,往往可以用贪心策略设计出一些复杂度为O(N)的算法。当然在多核算法中,贪心策略也是必不可少,比如任务图分解与调度问题,它就是一个NP难题,处理这类问题贪心策略往往是最有效的方法。
再看看“自私”,试问有那个人能一点都不“自私”。如果去观察一下小孩子的行为,很容易得出“人之初,性自私”的结论。“自私”也是大自然赋给人类的一种自然力量。
“自私”也能用来设计多核算法吗?答案是不仅可以,而且“自私”还是一种最有效的设计多核算法的优化策略之一。这里举个简单的例子,比如多核中的内存管理,如果每个线程都带有一个私有的内存管理器的话,那么分配内存时就只要从私有的内存管理器里进行分配就可以了,不需要进行加锁解锁操作,效率能提高多少可想而知。有兴趣者不妨去试试Intel开源项目TBB中的内存管理算法,就知道使用“自私”这种自然力量来设计多核算法有多大的好处了。
最后再看看“偷窃”,这可能会让大多数人产生怀疑,“偷窃”在人类社会中历来都是被看成是非法行为,这难道也是大自然赋给人类的自然力量?试看看自人类有史以来,有那个朝代和那个时期能够根绝“偷窃”这种现象,偷窃路人之物者有之,偷窃公家财物者有之,偷情者有之,甚至窃国者亦有之,…。不难发现,这个世界中充满了“偷窃”现象。再看看小孩子的行为,当小孩子看到自己想要的东西时,马上就会去把它拿到自己手中,可以说,“人之初,性喜偷”。所以“偷窃”也是一种大自然赋给人类的自然力量。
也许有人要问了,我就姑且先承认“偷窃”是一种自然力量吧,难道“偷窃”也可以用来设计多核算法不成?这可问到点子上了,“偷窃”这种自然力量还真的在多核算法中得到了使用,在多核的动态任务调度算法中,就用到了“偷窃”的思想,有兴趣的不妨去看看Intel的开源项目TBB中的任务调度算法,里面就用到了“偷窃”的思想,当然这个任务调度算法也使用“自私”的思想。
值得一提的是,动态任务调度算法可不是一个普通的算法,这可是多核中最酷的三大算法之一(另外两个就是前面提到的多核查找和多核内存管理算法)。许多的并行算法都可以通过这个算法来实现,并且你只要写一个串行的算法,那么就可以动态任务调度的方式自动将它变成并行算法,用它可以实现并行排序,并行数值计算,并行搜索等各种并行算法。这意味着程序员不需要学习并行计算的知识就可以复用以前单核时代的串行算法,由动态任务调度器自动将其变成并行算法,酷毙了吧!同时这也意味着多核程序中,大量的并行计算都在调用动态任务调度算法,都在进行“偷窃”动作。可见多核程序中也将充满“偷窃”现象。在南怀瑾的《老子他说》一书中p90页最后一行写道,“照道家的看法,这个世界本来就是一个相互偷盗的世界,彼此相偷,互相混水摸鱼”,这和多核程序中的相互偷盗可谓不谋而合。
看了上面这些内容,可以发现,道家的“无为”思想在多核计算中已经得到了充分的实践,道家思想中确实蕴含了深刻的多核计算原理和思想。虽然如此,但是也许有人要不高兴了,上面说的这些自然力量怎么尽是一些“贪心”、“自私”、“偷窃”,看起来像是人类阴暗面的东西。难道要让每个人都去尽情地“贪心”、“自私”、“偷窃”,才算符合道家的顺其自然之理,这不是要让人学坏吗?如果这样理解的话,我想就从根本上误会了道家的“无为”思想。
道家之所以提倡“无为”的顺其自然之理,在于它认为最优的东西必然是使用自然力量才能达到,并不等于使用了自然力量就一定可以达到最优。如果“老子”说使用了自然的力量就一定最优,那么我不仅不会说“老子”伟大,而且会认为他是一个浑蛋。世界上的任何东西都有它的使用范围,即需要合理使用它。当“贪心”变成“贪婪”,“自私”变成“损人利己”的时候,自然就超越了这些自然力量的使用范围,当然没有人会认同这种现象的发生。
话要说回来,世界是复杂的,有圣人就有浑蛋,“圣人不死,大盗不已”,总会有人做“贪婪”、“损人利己”的事情而不自知,而且他们偏偏认为这是最优的。所谓“有无相生”,滥用自然力量的人,最终逃脱不了自然的惩罚。看看最近华尔街的金融海啸,也许可以有所启示。