多核应用编程实战1.3 多处理器系统的特征_多核应用编程实战1.3 多处理器系统的特征试读-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > 多核应用编程实战 > 1.3 多处理器系统的特征

多核应用编程实战——1.3 多处理器系统的特征

虽然现在多核处理器已经极为普遍,但带有多处理器的系统也同样日益普遍。只要一个系统有多个处理器,内存访问就会变得更加复杂。数据不仅可以保存在内存中,而且也可以保存在其他处理器的缓存中。为使代码能正确执行,缓存中应该只有每个数据项的最新版本,这一功能称为缓存一致性。 提供缓存一致性的通常做法是窥探。每个处理器广播它要读取或写入的地址,其他处理器监听这些广播,一旦看到数据地址为自己所持有,可以采取以下两个动作:如果广播处理器要读取数据且监听处理器有最新的副本,则监听处理器可以返回数据;如果广播处理器要存储数据的最新值,则监听处理器使其副本失效。 然而,这并非处理多处理器时面临的唯一问题。其他问题还有内存布局和延迟等。 设想一个带有两个处理器的系统,对系统加以配置时可将所有内存分配给其中一个处理器,或是均匀地分配给两个处理器。图1-18显示了这两种选择。 处理器和内存间的每个环节都会增加该处理器的内存访问延迟。因此,如果内存只与一个处理器相连,那么该处理器的内存延迟较低,而另一处理器的内存延迟较高。在两个处理器都与内存相连的情况下,两者都有访问成本低的本地内存和访问成本较高的远程内存。 对于内存连到多个处理器的系统,有两个选择可减少对性能的影响。一种方法是交错内存,一般在缓存线边界上采取此法,这样对于大多数应用程序有一半的内存访问会面临短内存访问,一半则会遭遇长内存访问,平均下来应用程序的内存延迟会是两者的平均值。这种方法的典型代表称为UMA(Uniform Memory Architecture,统一内存架构),其中所有的处理器有相同的内存延迟。 另一种方法则是接受系统中的处理器对内存不同区域的访问将产生不同的访问成本,并使操作系统意识到这一硬件特征。有了操作系统的支持,这种方法可能会使应用程序通常访问本地内存,而其内存成本较低。采用这一架构的系统通常称为ccNUMA(cache coherent Nonuniform Memory Architecture,缓存一致的非统一内存架构)。 为使操作系统有效管理ccNUMA内存特征,有必要处理好以下问题。首先,操作系统需要了解系统的局部性结构,这样才能为每个处理器分配访问延迟低的内存。其次,一旦一个进程已经运行在特定处理器上,操作系统需要保证将该进程调度到该处理器上。如果操作系统未能实现第二个要求,那么当进程被转移时,所有本地分配的内存就会成为远程内存。 设想在双处理器系统的第一个处理器上运行的一个应用程序。操作系统可能已为其分配了第一个处理器的本地内存。图1-19显示了在一个处理器上运行并使用本地内存的应用程序的配置。此图中的阴影表示应用程序在处理器1上运行并访问直接连到该处理器的内存。因此,此进程的所有内存访问延迟都为本地内存延迟。 此应用程序将获得良好的性能,因为应用程序经常访问的数据将保存在访问延迟最小的内存上。但如果该应用程序随后被迁移到第二个处理器,那么它访问的数据就变成保存在远程内存上了,其性能会相应下降。图1-20展示了一个使用远程内存的应用程序。图中的阴影显示应用程序在处理器2上运行,但访问的数据却保存在连到处理器1的内存上。因此,该应用程序的所有内存访问都将提取远程数据,而提取远程数据需要更长的时间才能完成,因此应用程序会运行得更慢。 延迟和带宽对性能的影响 内存延迟是指从处理器请求数据项到从内存获得数据项的时间。系统中的处理器越多,内存延迟就越长。具有单处理器的系统其内存延迟小于100 ns;如果有两个处理器,则时间加倍,当系统更大、包含更多主板时,内存延迟可能会非常高。内存延迟是个问题,因为当处理器等待内存返回其需要的数据时通常无事可干。某些技术,如OoO(Out-of-Order,乱序)执行,使处理器等待从内存获取数据时能有所进展。然而,尽管这些技术可能遮掩从二级缓存获得数据所用的时间,但却不可能掩盖内存未命中的全部代价。此外,这些技术也大大增加了处理器核心设计的复杂性和实施区域。 内存延迟问题的另一个解决方案是使用支持多个硬件线程的核心。当一个线程停止运行、等待数据从内存返回时,其他线程仍然可以有所进展。因此,虽然拥有多个硬件线程不会提升已停止线程的性能,但却提高了核心的利用率,从增加了核心的吞吐量(即使某个线程停止,仍有数个线程能完成工作)。 讨论内存时经常提到的另一个相关指标是带宽。带宽测量每秒有多少数据从内存中返回。例如,假设虚拟CPU一秒钟发出1千万条加载指令且每个请求都未命中缓存。每次发生缓存未命中,就会从内存提取一个64字节的缓存线,因此一个虚拟CPU一秒钟就消耗了640 MB带宽。 一个CMT芯片就会请求大量的内存带宽,因为在任一刻,每个线程可能就有一个或多个尚未完成的内存请求。假设处理器上有64个线程,内存延迟是100个时钟周期,处理器主频为1 GHz。如果每个线程都在不断请求从内存提取新缓存线,那么每个线程每100周期就会发出一个这样的请求(因为完成一个请求需要100个周期),结果就是10亿 / 100 × 64 = 每秒640万次内存请求。如果每次都请求一个新的64字节缓存线,那么这意味着约41 GB/s的总带宽。

展开全文


推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

《多核应用编程实战》其他试读目录

• 第一章:硬件、进程和线程
• 1.1 计算机的内部结构
• 1.2 多核处理器的缘起
• 1.2.1 在单芯片上支持多线程
• 1.2.2 通过处理器核心流水线作业提高指令发出率
• 1.2.3 使用缓存保存最近使用的数据
• 1.2.4 用虚拟内存存储数据
• 1.2.5 从虚拟地址转换到物理地址
• 1.3 多处理器系统的特征 [当前]
• 1.4 源代码到汇编语言的转换
• 1.4.1 32位与64位代码的性能
• 1.4.2 确保内存操作的正确顺序
• 1.4.3 进程和线程的差异
• 1.5 小结
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  •