查字典图书网
当前位置: 查字典 > 图书网 > 编程 > 多核应用编程实战 > 试读

多核应用编程实战[试读]

第一章:硬件、进程和线程

要编写串行或并行应用程序,并非一定要了解硬件的工作原理,编写代码时完全可以将计算机内部结构视作黑盒子。然而,对处理器内部结构作一个基本了解会使稍后的主题更直观易懂。串行(或单线程)应用程序和并行(或多线程)应用程序之间的关键区别在于,由于多线程的存在,更多系统属性变得对应用程序重要起来。例如,单线程... 查看全部[ 第一章:硬件、进程和线程 ]

1.1 计算机的内部结构

从根本上讲,一台计算机包括一个或多个处理器以及一些内存,它们通过一些芯片和电线连接起来。此外,还有磁盘驱动器或网卡等辅助设备。 图1-1显示了一台个人计算机的内部结构。计算机由数个元件组成,处理器和内存插在称为主板的电路板上,从主板上伸出的电线与磁盘驱动器、DVD光驱等辅助设备相连。视频、网络支持... 查看全部[ 1.1 计算机的内部结构 ]

1.2 多核处理器的缘起

微处理器已存在相当长时间了。x86架构可追溯至1978年发布的8086,而SPARC架构则出现得稍晚,第一个SPARC处理器于1987年面世。在那段时间,性能提升多源自加快处理器时钟速度(最初的8086处理器时钟频率约为5 MHz,而最新处理器的时钟频率约是其600倍,超过3 GHz)和架构方面的改... 查看全部[ 1.2 多核处理器的缘起 ]

1.2.1 在单芯片上支持多线程

处理器的核心是芯片上负责执行指令的部分。核心有许多组成部分,我们将在本章稍后详细讨论其中某些部分。处理器的简化原理图见图1-3。 缓存是芯片上保存最近使用数据和指令的部分。查看一下处理器内的硅片(如图1-7所示),可以看到核心和缓存是肉眼可见的两个元件。关于缓存,请参见1.2.3节。 让芯片... 查看全部[ 1.2.1 在单芯片上支持多线程 ]

1.2.2 通过处理器核心流水线作业提高指令发出率

正如我们前面所说的,处理器的核心是处理器中负责执行指令的部分。早期的处理器每个时钟周期执行单条指令,因此运行频率为4 MHz的处理器每秒钟可执行400万条指令。执行单条指令的逻辑可能相当复杂,所以执行最长指令所用的时间决定了一个时钟周期的长度,并因此确定了处理器的最高时钟速度。 为了改进这种情况,... 查看全部[ 1.2.2 通过处理器核心流水线作业提高指令发出率 ]

1.2.3 使用缓存保存最近使用的数据

处理器请求从内存获取一组字节时,最终获得的不仅仅是这些字节。从内存中提取数据时,数据连同其相邻字节作为一条缓存线一起提取,如图1-12所示。根据系统中处理器的不同,缓存线可小至16字节,也可大至128字节或更多。缓存线的典型大小为64字节。缓存线总是对齐的,所以64字节缓存线的起始地址是64的倍数。... 查看全部[ 1.2.3 使用缓存保存最近使用的数据 ]

1.2.4 用虚拟内存存储数据

运行中的应用程序使用所谓的虚拟内存地址来保存数据。数据仍然保存在内存中,但应用程序使用的不是数据保存在内存芯片中的确切地址,而是虚拟地址,该虚拟地址随后被转换为物理内存的实际地址。图1-16是从虚拟内存转换为物理内存的过程示意图。 这种使用内存的方式看似复杂得毫无必要,但确有不少相当重要的优点... 查看全部[ 1.2.4 用虚拟内存存储数据 ]

1.2.5 从虚拟地址转换到物理地址

使用虚拟内存的关键步骤是把应用程序使用的虚拟地址转换为处理器使用的物理地址,以便从内存中提取数据。这一步通过处理器上称为TLB(Translation Look-aside Buffer,转换旁视缓冲器)的部分实现。通常,一个TLB用于转换指令地址(指令TLB,或称ITLB),另一个TLB则用于转换... 查看全部[ 1.2.5 从虚拟地址转换到物理地址 ]

1.3 多处理器系统的特征

虽然现在多核处理器已经极为普遍,但带有多处理器的系统也同样日益普遍。只要一个系统有多个处理器,内存访问就会变得更加复杂。数据不仅可以保存在内存中,而且也可以保存在其他处理器的缓存中。为使代码能正确执行,缓存中应该只有每个数据项的最新版本,这一功能称为缓存一致性。 提供缓存一致性的通常做法是窥探。每... 查看全部[ 1.3 多处理器系统的特征 ]

1.4 源代码到汇编语言的转换

处理器执行指令,指令是所有计算的基本构建块,执行如加法、从内存提取数据或将数据存储回内存等任务。指令在寄存器上进行操作,寄存器保存变量的当前值和其他机器状态。考虑代码清单1-1所示的代码段,其功能为递增指针ptr指向的整型变量。 代码清单1-1 将某个地址的变量+1的代码 void func( ... 查看全部[ 1.4 源代码到汇编语言的转换 ]

1.4.1 32位与64位代码的性能

从理论上说,一个64位处理器可以对多达16 EB(艾字节)的物理内存(4 GB的平方)寻址。相比之下,32位处理器只能对最多4 GB内存寻址。对于有些应用程序来说,只能对4 GB内存寻址是一种限制,例如轻易就会超过4 GB的数据库。因此,升级至64位寻址就能实现对更大数据集的操作。 X86处理器的... 查看全部[ 1.4.1 32位与64位代码的性能 ]

1.4.2 确保内存操作的正确顺序

当系统包含多个处理器或多个核心时,还有一个需要讨论的问题:内存排序。内存排序是内存操作对于系统中其他处理器可见的顺序。大部分时间,处理器无需程序员的任何干预即能正确处理事务。 然而,有些情况下程序员确实需要介入。这些情况可能与具体的架构(SPARC处理器和x86处理器有不同的要求)或具体的实施(不... 查看全部[ 1.4.2 确保内存操作的正确顺序 ]

1.4.3 进程和线程的差异

对进程和线程如何构成软件及如何映射到内存进行探究颇有益处。本节将介绍一些在未来几章常会提到的概念。应用程序包括指令和数据,在其开始运行之前,这些只是一些分布在磁盘上的指令和数据,如图1-21所示。 正在执行的应用程序称为进程,进程不仅仅是指令和数据,它还有状态。状态是保存在处理器寄存器中的一组... 查看全部[ 1.4.3 进程和线程的差异 ]

1.5 小结

本章介绍了一些处理器架构的术语。要关注的重点在于如何将缓存用于提升应用程序的性能和怎样利用TLB才能实现对虚拟内存的使用。本章还介绍了在单个处理器上支持多个线程的多种方式。尽管这种资源共享的实施细节在高层次上的抽象并不重要,我们仍将在稍后讨论这些细节如何对性能产生明显影响。最后,本章描述了进程和软件... 查看全部[ 1.5 小结 ]