自发表老子是伟大的多核计算科学家一文来收到许多网友的强烈反响褒扬者有之砸板砖者亦有之不过板砖数量倒是在我的意料之中凡是跟哲学或者说是玄学的东西沾上边的总会招来一阵口舌之争虽然砸板砖者也没有说出任何反驳的道理来但是并不代表那篇文章就很完美没有不足的地方实际上那篇文章中只涉及了多核编程的一个层面的思想还有另外三层思想没有被提及这也许可以算作是那篇文章的不足之处吧为弥补其不足之处下面从四个层面来阐述多核编程的基本思想 第一层 先天方法策略层 第一层的基本思想就是老子是伟大的多核计算科学家一文中所提及的几个基本思想贪心自私偷等这些东西是先天存在的是人类的一种本能它又可以看作是方法策略因此把这层叫作先天方法策略层 先天的方法策略并不限于贪心自私偷这三种去年的SD大会上我讲过一个基于抢夺的分布式内存管理算法说明抢也是一种先天的方法策略所谓 人之初性本贪性自私性喜偷性喜抢 为避免误解这里先说明一下这里所说的偷抢和通常意义的偷抢并不完全相同偷和道家意义上的偷是同一个含义即不与取之意抢则是取不归还之意 昔范蠡云且夫天舆弗取反受其咎既然上天给了我们这么多好的方法策略不用它的话显然是一种糟蹋在多核编程中如何使用这些策略来进行编程开源项目TBB中可以找到详细的代码例子 第二层 目标需求评价层 先天的方法策略虽然看似简单但要用好它并不是一件容易的事情自私贪心偷抢等先天方法既可以用来做好事也可以用来做坏事这就牵涉到如何评价是否用好了这些先天方法策略的问题也就是第二层目标需求评价层所需要解决的问题 并不能为了使用先天方法策略而使用它而是用它来满足我们的需求到达一定的目标那么这个需求和目标是什么呢? 在这里不想对一般的需求进行分析只分析优化方面的需求要达到优化可以理解为各种资源的有效利用可能有很多人已经有这方面的理解这些资源可以分为以下几个方面 )时间资源 时间资源指的就是时间比如一段程序或算法需要运行多长时间 )空间资源如内存硬盘网络各种IO设备资源等均属于空间资源 )计算资源如CPUGPU各种板卡上的处理器等均属于计算资源 )能源资源通常指的是电能的消耗量由于全球变软环保问题的日益重要这个在以往被忽视的资源也变得重要起来 如何有效利用上述资源并在各种资源利用间取得均衡是制定目标和需求的基础也是评价程序或算法优化程度的基础 第三层 本质根源保障层 资源的有效利用可不是一件简单的事情在单核时代许多程序员已有时间资源和空间资源的利用及均衡方面的丰富经验那时几乎不用考虑计算资源的利用问题因为处理器只有一个 然而在多核系统中计算资源的利用成了头号问题多个处理器的使用使得程序员必须考虑如何将程序在各个处理器上并行地执行这就牵涉到一个负载均衡问题 负载均衡问题历来属于难题由于客观上存在大量的共享资源各种不同的共享资源情况复杂并不能简单地将负载平均一下就摊到各个CPU核上去执行那么用什么来保障负载平衡呢?如何去达到资源有效利用的终极目标需求呢? 要保障目标需求的实现其核心就是公平正义问题当然对公平正义这两个词的理解现实情况中存在多种解释这里采用更广义的解释凡是可从正确的前提通过逻辑推导出来的定义均视做正义例如自然科学中的所有公理定理及推论均属于正义在人类社会中一些公认的道德标准法律条文也属于正义 以动态偷取的调度算法为例一般都是设计成每个线程一次偷取一个任务实际上已经隐含地使用公平正义对偷取的数量做了限制倘若不如此任由一个线程一次将队列中所有任务都偷走那么其他线程就偷不到任务了这样就会出现负载不均衡无法有效地利用多个处理器的计算资源 再比如基于抢夺的内存分配算法每个线程使用了共享内存后它并不返回给它的属主线程而是据为己有这样时间一长必然有某些线程占有了过多的内存资源为了解决这个问题解决方法就是每次抢完后都需要判断一下自己占有的内存数量是否过多过多的话则主动将一部分内存归返给公共内存池从而实现负载均衡可以看出基于抢夺的内存分配算法中也使用了公平正义以确保负载均衡 公平正义问题可以说是算法之本全局效率之源为什么这么说呢?不妨看看现在美国发生的次贷危机其根本原因是由于银行将贷款发放给无偿返能力的客户所造成的从公平正义的角度看实质上是银行为了自身的贪心自私违反了基本的公平正义问题次贷危机的后果无需我多言大家均已看到可见没有公平正义贪心自私等先天方法策略必然会被滥用其结果必然导致全局的不优 由此可见公平正义是保障贪心自私偷抢等先天方法策略得以正确使用的前提条件本层名称中的本质根源保障说的就是公平正义 需要提及的是在人类社会的现实中由于人是有情感的公平正义在执行中总会存在偏差这时就需要仁爱来弥补其不足这也许是儒家思想能够流传两千多年而不灭的根本原因当然如果把仁爱思想也看作是道德标准的一部分的话按照前面给出的正义的定义其实仁爱也属于正义的范畴 第四层 算法实现执行层 通过上面三个层面的阐述可以知道先天的方法策略是实现优化的基本手段资源有效利用则是实现优化的目标需求及评价条件公平正义则是保障先天的方法策略合理使用的前提条件是不是有了这几样东西就可以做到达成优化的最终结果呢? 答案是非也如果上面那几个东西就可以达成优化的结果那么从街上随便抓个人恐怕都可以写出很好的多核程序来了还要程序员干嘛还要去学习多核编程的各种模式技巧及算法干嘛? 就像学了牛顿力学一样有些人可以设计出摩天大厦造出各种机械有些人却啥也做不了何也?运用好坏之不同也要写出好的多核程序同样牵涉导如何运用上面三层中的基本原理思想方法的问题而要用好这些基本原理思想更多的还是要靠程序员自身的知识及能力最终依赖于算法或程序的具体实现就像有了道家儒家却仍然少不了法家农家医家等各个领域的诸子百家 怎样写出好的多核算法或程序来? 好好学习天天向上是也 |