多核编程的四层境界
作者:周伟明 (博客地址:http://blog.csdn.net/drzhouweiming)
版权申明:这篇文章可以被自由转载,如果修改其中的内容需征得作者同意。
自发表“老子是伟大的多核计算科学家”(欲看此文,请点这里)一文来,收到许多网友的强烈反响,褒扬者有之,砸板砖者亦有之。不过板砖数量倒是在我的意料之中,凡是跟哲学或者说是玄学的东西沾上边的,总会招来一阵口舌之争。虽然砸板砖者也没有说出任何反驳的道理来,但是并不代表那篇文章就很完美,没有不足的地方。实际上那篇文章中只涉及了多核编程的一个层面的思想,还有另外三层思想没有被提及,这也许可以算作是那篇文章的不足之处吧。为弥补其不足之处,下面从四个层面来阐述多核编程的基本思想。
第一层 先天·方法·策略层
第一层的基本思想就是“老子是伟大的多核计算科学家”一文中所提及的几个基本思想:“贪心”、“自私”、“偷”等。这些东西是先天存在的,是人类的一种本能,它又可以看作是方法、策略,因此把这层叫作“先天·方法·策略层”。
先天的方法策略并不限于“贪心”、“自私”、“偷”这三种,去年的SD大会上,我讲过一个基于抢夺的分布式内存管理算法,说明“抢”也是一种先天的方法策略。所谓:
“人之初,性本贪,性自私,性喜偷,性喜抢。”
为避免误解,这里先说明一下,这里所说的“偷”、“抢”和通常意义的偷、抢并不完全相同。“偷”和道家意义上的偷是同一个含义,即“不与取”之意;“抢”则是取“不归还”之意。
昔范蠡云:“且夫天舆弗取,反受其咎”。既然上天给了我们这么多好的方法策略,不用它的话显然是一种糟蹋。在多核编程中如何使用这些策略来进行编程,开源项目TBB中可以找到详细的代码例子。
第二层 目标·需求·评价层
先天的方法策略,虽然看似简单,但要用好它并不是一件容易的事情。自私、贪心、偷、抢等先天方法既可以用来做好事,也可以用来做坏事。这就牵涉到如何评价是否用好了这些先天方法策略的问题,也就是第二层目标·需求·评价层所需要解决的问题。
并不能为了使用先天方法策略而使用它,而是用它来满足我们的需求,到达一定的目标。那么这个需求和目标是什么呢?
在这里不想对一般的需求进行分析,只分析优化方面的需求。要达到优化,可以理解为各种资源的有效利用,可能有很多人已经有这方面的理解【1】。这些资源可以分为以下几个方面:
1)时间资源, 时间资源指的就是时间,比如一段程序或算法需要运行多长时间。
2)空间资源,如内存、硬盘、网络、各种IO设备资源等均属于空间资源。
3)计算资源,如CPU、GPU、各种板卡上的处理器等均属于计算资源。
4)能源资源,通常指的是电能的消耗量,由于全球变软,环保问题的日益重要,这个在以往被忽视的资源也变得重要起来。
如何有效利用上述资源,并在各种资源利用间取得均衡,是制定目标和需求的基础,也是评价程序或算法优化程度的基础。
第三层 本质·根源·保障层
资源的有效利用,可不是一件简单的事情。在单核时代,许多程序员已有时间资源和空间资源的利用及均衡方面的丰富经验,那时几乎不用考虑计算资源的利用问题,因为处理器只有一个。
然而,在多核系统中,计算资源的利用成了头号问题,多个处理器的使用,使得程序员必须考虑如何将程序在各个处理器上并行地执行,这就牵涉到一个负载均衡问题。
负载均衡问题历来属于难题,由于客观上存在大量的共享资源,各种不同的共享资源情况复杂,并不能简单地将负载平均一下就摊到各个CPU核上去执行。那么用什么来保障负载平衡呢?如何去达到资源有效利用的终极目标需求呢?
要保障目标需求的实现,其核心就是公平、正义问题。当然,对公平、正义这两个词的理解,现实情况中存在多种解释,这里采用更广义的解释,凡是可从正确的前提通过逻辑推导出来的定义,均视做正义,例如自然科学中的所有公理、定理及推论,均属于正义。在人类社会中,一些公认的道德标准、法律条文,也属于正义。
以动态偷取的调度算法为例,一般都是设计成每个线程一次偷取一个任务,实际上已经隐含地使用公平正义对偷取的数量做了限制,倘若不如此,任由一个线程一次将队列中所有任务都偷走,那么其他线程就偷不到任务了,这样就会出现负载不均衡,无法有效地利用多个处理器的计算资源。
再比如基于抢夺的内存分配算法,每个线程使用了共享内存后,它并不返回给它的属主线程,而是据为己有,这样时间一长,必然有某些线程占有了过多的内存资源。为了解决这个问题,解决方法就是每次抢完后,都需要判断一下自己占有的内存数量是否过多,过多的话则主动将一部分内存归返给公共内存池,从而实现负载均衡。可以看出基于抢夺的内存分配算法中也使用了公平、正义以确保负载均衡。
公平、正义问题可以说是算法之本,全局效率之源。为什么这么说呢?不妨看看现在美国发生的次贷危机,其根本原因是由于银行将贷款发放给无偿返能力的客户所造成的。从公平、正义的角度看,实质上是银行为了自身的贪心、自私,违反了基本的公平、正义问题。次贷危机的后果,无需我多言,大家均已看到。可见,没有公平正义,贪心、自私等先天方法策略必然会被滥用,其结果必然导致全局的不优。
由此可见,公平、正义是保障贪心、自私、偷、抢等先天方法策略得以正确使用的前提条件。本层名称中的本质、根源、保障,说的就是公平、正义。
需要提及的是,在人类社会的现实中,由于人是有情感的,公平正义在执行中总会存在偏差,这时就需要仁爱来弥补其不足,这也许是儒家思想能够流传两千多年而不灭的根本原因。当然,如果把仁爱思想也看作是道德标准的一部分的话,按照前面给出的正义的定义,其实仁爱也属于正义的范畴。
第四层 算法·实现·执行层
通过上面三个层面的阐述,可以知道先天的方法策略是实现优化的基本手段,资源有效利用则是实现优化的目标需求及评价条件,公平、正义则是保障先天的方法策略合理使用的前提条件。是不是有了这几样东西就可以做到达成优化的最终结果呢?
答案是“非也”。如果上面那几个东西就可以达成优化的结果,那么从街上随便抓个人恐怕都可以写出很好的多核程序来了,还要程序员干嘛,还要去学习多核编程的各种模式、技巧及算法干嘛?
就像学了牛顿力学一样,有些人可以设计出摩天大厦,造出各种机械,有些人却啥也做不了。何也?运用好坏之不同也。要写出好的多核程序,同样牵涉导如何运用上面三层中的基本原理思想方法的问题,而要用好这些基本原理思想,更多的还是要靠程序员自身的知识及能力,最终依赖于算法或程序的具体实现。就像有了道家,儒家,却仍然少不了法家、农家、医家等各个领域的诸子百家。
怎样写出好的多核算法或程序来? “好好学习、天天向上”是也【2】。
备注:
【1】 08年深秋,与孟岩先生在上海相聚,一起聊到对多核计算的理解时,他谈起了各种资源如CPU资源的有效利用问题。
【2】 关于学习写多核程序,提供一些学习材料给大家参考如下。
1) TBB开源项目: http://www.threadingbuildingblocks.org/
曾有人说过:“源代码是最好的文档”。这个开源项目的内容不仅是目前多核编程方面做得最好的,更重要的是它里面还挂有很多其他并行计算方面的开源项目的链接,因此值得上去看一看。
2) “多核编程高处并不“寒””,文章地址: http://news.csdn.net/n/20081107/120632.html
当然这条和最后一条都有给我自己做广告的嫌疑,之所以不计嫌疑地推荐大家看这篇文章, 主要的原因是这篇文章里有我对现在市面上有关多核编程和并行计算书籍的一个点评。可以给大家购买书籍作为一个参考。
3)Intel软件社区多核论坛:http://forum.csdn.net/Intel/IntelMulti-core/
4)我的博客:http://blog.csdn.net/drzhouweiming
里面有一些关于多核编程方面的文章。
上面列出的学习材料没有包括多线程编程的基础方面的书籍资料,这方面的资料网络上可以搜索到一大批,出版过的书籍众多,请恕我在这里不一一列出。
分享到:
相关推荐
VxWorks SMP多核编程指南是针对VxWorks操作系统中对称多处理(SMP)和非对称多处理(AMP)模式编程的详细文档。SMP指的是多处理器共享同一内存和I/O资源,而AMP则是指每个处理器都有自己的私有内存和I/O资源。...
多核编程是现代计算机技术的重要组成部分,随着处理器技术的发展,多核处理器已经成为主流,它通过在一枚处理器中集成两个或多个内核,实现并行计算,从而提高整体性能。相较于单核处理器,多核能够在保持较低功耗的...
"多核编程1.pdf"和"多核编程2.pdf"可能涵盖了这些主题,包括但不限于多核编程的优势、并行编程模型、线程管理、同步机制、资源调度策略以及如何在实际项目中应用多核编程技术。通过学习这些内容,你可以逐步熟悉多核...
《多核编程艺术》这本书由荷里希(Maurice Herlihy)和谢菲特(Nir Shavit)合著,是并发编程领域的一本经典之作。它深入探讨了多核处理器环境下如何有效地进行程序设计,以充分利用硬件资源,提高软件性能。以下是...
多核编程技术指南 在计算机科学领域,随着处理器技术的发展,多核处理器已经成为主流,为开发者提供了并行处理的能力,从而提升系统性能。多核编程是利用这些多核处理器资源来实现高效并行计算的关键技术。本文将...
AURIX™多核编程精华应用笔记围绕着如何在基于AURIX™的多核项目中开展编程工作,提供了详细的指导和案例分析。首先,笔记介绍AURIX™是英飞凌在2012年推出的第五代TriCore™系列,首次实现了最多包含三个32位...
#### 四、多核编程策略 为了充分利用多核处理器的能力,开发者需要采取适当的编程策略。 1. **任务并行化**: - 将任务分解成多个独立的部分,并行处理以提高效率。 - 适用于那些可以分割成多个子任务的应用程序...
在现代计算机科学中,多核编程是提升性能和效率的关键技术。随着硬件的进步,多核处理器已经成为主流,为开发者提供了并行处理数据的能力。本文将深入探讨多核编程的概念、重要性以及如何通过代码实现并行计算。 ...
多核编程之挑战与应对—-孔晓华_计算机系统结构
【标题】:“Intel多核编程资料.ppt” 【描述】:“Intel 多核编程全部课件, 跟[Intel Multi-core programming]配套” 【标签】:“Multi-core” 多核编程涉及的技术和概念广泛,主要涵盖了微处理器的发展历程、...
《多核编程指南》是一本深入探讨如何在现代多核处理器环境下进行高效程序设计的专著,由Shameem Akhter与Jason Roberts共同撰写,于2006年由Intel Press出版。本书聚焦于通过软件多线程技术来提升程序性能,是IT专业...
### 多线程与多核编程 #### 13.1 进程与线程 **13.1.1 进程与多任务** 进程是操作系统中的一个重要概念,指的是正在执行中的程序。在现代多任务操作系统中,可以同时运行多个程序。进程包含了程序在内存中的所有...
多线程与多核编程是现代计算机系统中提高性能和响应速度的重要技术。在这个领域,开发者需要理解如何有效地利用计算资源,特别是在处理大数据量或计算密集型任务时。以下是对这些概念的详细解释: 1. **多线程**:...
《Scala程序设计:Java虚拟机多核编程实战》是一本专为程序员和有经验的Java开发者设计的书籍,旨在引导读者掌握Scala语言,利用其功能强大的特性进行并发编程。Scala是一种融合了函数式和面向对象编程特点的静态...
Java 8引入了lambda表达式和流API,为多核编程提供了强大而灵活的工具,使得开发者能更有效地利用现代多核处理器来提升程序的性能。 首先,关于lambda表达式,这是一种简洁的定义接口实例的方式,也称为匿名函数。...
《精通lambda表达式:Java多核编程》这本书深入探讨了如何利用Java的lambda表达式进行高效、现代化的多核编程。Lambda表达式是Java 8引入的一项重要特性,它极大地简化了函数式编程,使Java开发者能够更好地利用多核...
《精通Lambda表达式:Java多核编程》