Posts in category 并行、并发控制论并行化[url=http://www.wzxue.com/论并行化/]
一13th
2013
[/url]
Leave a Comment
Written by 麦子麦
大多数写过程序的人都知道并发的概念,里面的一部分人知道并发和并行的区别,再里面一部分人知道多线程是并行化的一种方式,但大多数人基本把多线程等同于并行编程,把并行化等同于多线程程序。
并行化是一个抽象概念,它不是指某种或某类技术,而是指只要一个程序能同时进行多种计算,那它就是并行化。以这个逻辑出发,Linux、MySQL是众所周知的并行程序,并且基本上所有的桌面程序都是并行程序。但是很多了解并行编程难处的人都知道,这两类程序达到并行化的难度天壤之别,并行编程导致的问题远远超出一般顺序编程锁导致的。但是为什么后者同样是并行化但是更容易呢?一些人可能会知道这两个概念:显式并行化和隐式并行化。两者的区别就是并行化程序是否依赖于编译器、解释器或者库,而不是程序员显式的在程序中键入为实现并行化的代码,最常见的隐式并行化就是SQL。但是它们往往只是向并行化更加一层迷雾罢了,远远不能解释并行化在计算机体系中的本质。
在这里,引用一张来自《Is Parallel Programming Hard, And, If So, What Can You Do About It?》的图片。
Figure 1
在这个结构中,底层的Firmware要想实现并行化,只能依赖于直接与CPU沟通实现,它的并行化也最原始和复杂,但由于通常它的业务逻辑比较简单因此也没有太大的问题,Operating System Kernel是最难的并行程序,它为了提供给上层程序利用底层硬件并行计算的能力,内核本身又是并行化的,它需要用最原始的手段达到这一效果。Linux Kernel具有自己的一个内核多线程库,依赖于这个库实现了多线程并行化。System Library指的类似于Pthread库这类提供给应用程序的并行库,应用程序可以通过Pthread库实现并行化。应用软件可以分为基础软件和业务软件,基础软件指的是DBMS,Web Server之类,业务软件可以是Web App,办公软件等等,DBMS如MySQL实现并行化依赖于多线程库,而Web App也可以自己利用Pthread库或者脚本语言自己包装的多线程库等等。这可能是大多数人根深蒂固的一个并行化体系。
但是除了以上方式,利用操作系统提供的多道程序执行能力,可以同时运行多个程序实例达到并行化,也可以依赖于已经实现并行化的基础软件来实现并行化这类更难以直观感受并行的方式,还有MPI,OpenMP等等库来实现,这些方式统统都可以用一个概念来解释,它们都是在Figure 1中利用下层物件提供的并行化,MySQL利用Operating System Kernel提供的多线程库并行化,Web App利用MySQL提供的并行化来实现并行执行,SQL语言利用后端DBMS支持实现并行化,Map-Reduce程序利用Map-Reduce来实现并行化计算等等,我们可以发现,越上层物件可利用的资源越丰富,它们既可以直接与硬件沟通,也可以利用System提供的并行库,还可以依赖已经实现并行化的基础软件来实现并行化,也可以利用System提供的多道程序并行能力来运行多个实例达到。那么这些方式的差别在于哪呢?
[list=1]
[]通用性
[]性能
[*]生产力
[/list]
我们可以发现,在Figure 1中,Operating System Kernel提供的并行库能被所有上层物价使用,也就是它的通用性非常强,性能也很高,但是它的生产力低下,利用它的难度远远高出高层软件直接利用解释器或者基础软件提供的并行能力。而SQL语言依赖于后端DBMS提供的并行能力,DBMS基本可以视为SQL的解释器,那么这一方式上,性能取决于DBMS实现的方式,而生产力可以不言而喻,SQL使用者基本可以做到非技术人员也可以使用,但通用性缺很差,DBMS提供的并行化只能让SQL做到并行,而不能让其他物件,因此性能和生产力较好,通用性较差。而OpenMP、MPI这类并行库则是提高了生产力,使其更容易使用,但是又降低了性能和通用性。
因此我们可以发现,生产力、性能、通用性是三个相互权衡的点,越上层提供的并行能力越专注于生产力,越下层提供的方式专注于性能和通用性。
参考 1. 《Is Parallel Programming Hard, And, If So, What Can You Do About It?》(http://kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook-1c.2012.08.08a.pdf)