基于任务模型的软件开发
多核心共享内存下的软件开发
在2005年,Herb Sutter在Dr.Dobb’s Journal上发表了题为“免费午餐结束:软件开发将转向并发编程”的文章。其中他谈到现在又必要在软件开发中考虑并发了,从而充分的挖掘呈指数量级增加的微处理器的潜能获取生产力的提高。现在微处理器厂商一直都在增加处理器的核心,而不是增加时钟频率。软件开发者将不能够依赖增加处理器时钟频率免费获取性能的提升。
现在几乎所有的机器的处理都至少有两个核心。然而,四核和八核的微处理器在服务器、高级工作站上很流行,甚至是高端的便携电脑。拥有更多内核的单个处理器就将要到来。现代化的微处理器提供了新的多核结构。所以,为软件设计和代码开发做一些准备来充分的利用这种架构还是很重要的。使用visual C#2010 和 .NET 4生成的各种不同类型的程序运行在微处理器的一个或者多个核心上。每一个这样的微处理器都可能有不同数目的内核,具有同时执行多条指令的能力。
你可以将多核微处理器想象为内部有多个相互连通的微处理器的包。所有的核心都可以想图1-1中那样访问主存储器。这就是著名的多核共享内存架构。此架构中的内存共享极易导致性能瓶颈。
图 1-1. 共享内存架构图
多核微处理器有很多不同的复杂的微架构,这些设计都是为了提供更强的并行执行能力,提高生产力、减少潜在的性能瓶颈。同时,多核处理器也尽力来减少电能消耗和产生更少的热量。因此,很多现代的微处理器能够根据自己的负载动态的增加和减少每个核心的时钟频率,设置当某些核心不再使用的时候使他们休眠。Windows7和windows server 2008 R2支持一种叫做核心场的新特性。当很多的核心不再使用的时候,就会激活这种特性,此时操作系统就会休眠这些内核。当需要这些内核的时候,操作系统就会唤醒正在休眠的内核。
现在的微处理器工作的时候可以动态的更改每个内核的时钟频率。由于这些内核并不是以固定的时钟频率进行工作,所以很难预测某个指令序列的性能。例如,英特尔的Turbo Boost技术增加活动内核的频率。这个增加内核时钟频率的处理过程也就是著名的overclocking(超频?)。
如果一个内核超负载工作而其他的内核都处于闲置状态,这种技术就允许它以更高的时钟频率运行。如果有很多的内核都超负荷工作,这些内核也会以更高的频率运行,但是不会高于只有一个核心(超负荷运行)的情况。但是微处理器并不能一直保持所有的内核一直超频运行,因为这样会消耗很多的电能,并且温度也上升的很快。由于所有内核超负载运行的平均时钟频率要低于只有一个核心超负载运行的频率。因此,在特定情况下,某些代码运行时的时钟频率高于其他代码,这使测量程序真正的性能成为一种极大地挑战。
多核共享内存与分布式内存系统的区别
分布式内存计算机系统是由很多带有自己私有内存的微处理器组成的,其结构如图1-2所示。每个微处理器都位于一个不同的计算机里,它们彼此之间都有不同类型的通信通道。比如有线和无线网络的通信通道。如果正在一个微处理器上处理的工作需要远程的数据,那么它必须通过通信通道与相应的远程处理器进行通信。运行在分布式内存计算机系统上的并行应用程序广泛使用的通信协议是MPI(Message Passing Interface)。在C#和.NET中使用MPI也能充分利用多核共享内存架构的优势。但是MPI的主要专注改善运行在集群上的应用程序的开发。由于多核共享内存架构中多核之间访问并不需要发送消息,这样就给多核共享内存增加了一个大的开销。
图1-2. 分布式内存系统结构图
图1-3展示了拥有三台机器的分布式内存计算机系统。每个机器都有一个四核的处理器和这些内核使用的内存共享架构。这样,每个处理器的私有内存同时也扮演着其四个内核的共享内存的角色。
一个分布式内存系统强制你考虑数据的分布式,因为每个消息检索的远程数据都可能引入潜在的不确定性。由于你可以添加新的机器节点来增加微处理器的数量,所以分布式内存系统能够提供很大的扩展能力。
图 1-3 .混合架构图