2020-10-26 12:43·重学IT的老猫
之前,CPU的性能还主要取决于CPU的主频,经过超摩尔定律的发展后,没过多长时间CPU的主频速度就已接近“极限”,使得单单靠提高CPU的主频来提升性能变得非常困难。
目前,Intel、AMD等CPU生产商都转而采用了多核技术来提升CPU性能。系统设计趋势是将多个计算核放到单个芯片。无论多个计算核是在多个CPU芯片上还是在单个CPU芯片上,我们称之为多核(multicore)或多处理器(multiprocessor)系统。
双核处理器 = 一个处理器上包含两个内核
多核处理器 = 一个处理器上包含两个或多个内核
多线程编程提供机制,以便更有效地使用这些多个计算核和改进的并发性。考虑一个应用,它有 4 个线程。对于单核系统,并发仅仅意味着线程随着时间推移交错执行(如下图),因为处理核只能同一时间执行单个线程。
单核系统上的并发执行
对于多核系统,并发表示线程能够并行运行,因为系统可以为每个核分配一个单独线程(如下图)
多核系统上的并行执行
并行性(parallelism)和并发性(concurrency)
并行系统可以同时执行多个任务。相比之下,并发系统支持多个任务,允许所有任务都能取得进展。因此,没有并行,并发也是可能的。
在 SMP(Symmetrical Multi-Processing 对称多处理) 和多核架构出现之前,大多数计算机系统只有单个处理器。CPU 调度器通过快速切换系统内的进程,以便允许每个进程取得进展,从而提供并行假象。这些进程并发运行,而非并行运行。
随着系统线程数量从几十个到几千上万个,CPU 设计人员通过增加硬件来改善线程性能的提高系统性能。现代 Intel CPU 的每个核经常支持两个线程,这种支持意味着,可以将多个线程加载到处理核以便快速切换。毫无疑问,多核计算机将继续增加多核数量和硬件线程支持。
编程挑战
多核系统趋势继续迫使系统设计人员和应用程序开发人员更好地使用多个计算核。操作系统设计人员必须编写调度算法利用多个处理核以便允许并行执行,如上图(多核系统上的并行执行)。对于应用程序开发人员来说,挑战是修改现有程序和设计新的程序以便利用多线程。
一般而言,多核系统编程有五个方面的挑战:
- 识别任务:这涉及分析应用程序,查找区域以便分为独立的、并发的任务。在理想情况下,任务是互相独立的,因此可以在多核上并行运行。
- 平衡:在识别可以并行运行任务时,程序员还应确保任务执行同等价值的工作。在有些情况下,有的任务与其他任务相比,可能对整个任务的贡献并不多;采用单独核来执行这个任务就不值得了。
- 数据分割:正如应用程序要分为单独任务,由任务访问和操作的数据也应划分以便运行在单独的核上。
- 数据依赖:任务访问的数据必须分析多个任务之间的依赖关系。当一个任务依赖于另一个任务的数据时,程序员必须确保任务执行是同步的,以适应数据依赖性。
- 测试与调试:当一个程序并行运行于多核时,许多不同的执行路径是可能的。测试与调试这样的并发程序比测试和调试单线程的应用程序自然更加困难。
由于这些挑战,许多软件开发人员认为,多核系统的出现将需要一个全新方法来设计未来软件系统。同样,许多计算机科学教育者也认为:软件开发课程应当强调平行编程。
并行类型
- 数据并行(data parallelism)
- 数据并行注重将数据分布于多个计算核上,并在每个核上执行相同操作。例如,考虑一下对大小为 N 的数组的内容进行求和。对于单核系统,一个线程只能简单相加元素 [0]…[N-1]。不过,对于双核系统,线程 A 运行在核 0 上,相加元素 [0]…[N/2-1];而线程 B,运行在核 1 上,相加元素 [N/2]…[N-1]。这两个线程可并行运行在各自的计算核上。
- 任务并行(task parallelism)
- 任务并行涉及将任务(线程)而不是数据分配到多个计算核。每个线程都执行一个独特的操作。不同线程可以操作相同的数据,或者也可以操作不同的数据。再考虑刚才的例子。与那个情况相反,一个并行任务的例子可能涉及两个线程,每个线程对元素数组执行一个唯一的统计操作。再次,线程在单独计算核上并行操作,但是每个执行一个独特操作。
- 从根本上说,数据并行涉及分布数据到多个核,而任务并行分布多个任务到多个核。然而,在实践中,应用程序很少严格遵循数据或任务并行。在大多数情况下,应用程序混合使用这两个策略。
并行的两个重要定律
- Amdahl定律(阿尔达尔定律)
Amdahl定律定义了串行系统并行化后的加速比的计算公式和理论上限,就是将一个串行系统改造成并行系统后,或者增加多个CPU之后,系统执行速度提升有多少。
加速比定义:加速比=优化前系统耗时/优化后系统耗时
总结:增加CPU处理器的数量并不一定能起到有效的作用,合理增加并行处理器数量,才能以最小的投入,得到最大的加速比。
- Gustafson定律(古斯塔夫森)
Gustafson定律主要说明处理器个数,串行比例和加速比之间的关系。
Gustafson定律假设优化后的的执行时间为:a+b。其中a为串行执行时间、b为并行执行时间,那么优化前的执行时间为:a+nb。其中n为CPU的个数,有n个CPU,那么并行所耗时间就需要递增n倍。
只要有足够的并行化,那么加速比和CPU个数成正比
Amdahl定律和Gustafson定律说明加速比的角度是不同的,Amdahl定律说明光增加CPU的个数是没有意义的,还必须增加串行化比例才行。而Gustafson定律说明如果串行化比例一定的情况下,增加CPU,那么系统的性能就会提升。总的来说,如果系统通过多核CPU、并行化处理来提升性能的话,需要做两件事情:控制好串行化和CPU个数。