超标量编程 101(矩阵相乘)第 4 部分(共 5 部分)

上一篇文章(第 3 部分)中,我们了解了在两个单处理器系统上用 QuickThread 并行双打方法执行矩阵相乘的效果:


在英特尔 Q6600(四核,无超线程技术)中,有 2 个核心(2 条线程)共享 L1 和 L2 高速缓存,相比串行方法实现了 40 到 50 倍的性能提升。在英特尔酷睿 i7 920(四核,有超线程技术)中,有 4 个核心(8 条线程)共享 1 个 L3 高速缓存,1 个核心(2 条线程)共享 L1 和 L2 高速缓存,实现了70 到 80 倍的性能提升。下面,我们来看看使用 2 枚类似于酷睿 i7 920 的处理器如何执行。

在配有 2 个插槽和 2 个 L3 高速缓存的双核至强 5570 系统上运行时,每个高速缓存分别供 4 个核心(8 条线程)共享;在每枚配有 4 个 L2 和 4 个 L3 高速缓存的处理器上运行时,每个高速缓存分别供 1 个核心和 2 条线程共享。我们发现:

图 17

在 N = 700 到 1344 的范围内,串行扩展在 140 到 150 倍之间。性能几乎是酷睿 i7 920 的两倍。这在预料之中。

关于该性能描述,我们观察到了一些非常有趣的结果。虽然两倍的速度提升在预料之中,但是执行并行转置方法以及并行双打方法(N = 700 到 1024 之间)后,性能急剧下降。这大约是并行双打方法(700 到 1024 之间)的性能峰值范围的一半。

为什么平缓部分在同一高度呢?
出现下降差异的原因是什么?

平缓部分在同一高度的原因与图 5 和 图 6 中串行转置性能与并行转置性能在本质上是相同的原因如出一辙(图 17 中的黄色和红色线条)。具体原因是:资源带宽限制。在图 5 和图 6 中,限制资源似乎是内存带宽(由于并行双打方法明显比并行转置出色)。由于平缓部分(N = 700 到 1024 之间)的相对等同性,所以内存带宽以外的其它资源似乎是限制因素。这就造成了高速缓存访问开销或 SSE 浮点瓶颈。

这两类瓶颈往往会降低性能曲线的高度,但不会缩减宽度。如以上图表所示,两种并行双打方法成功使峰值性能曲线的宽度增加了一倍,因此允许该程序高效处理更大的矩阵。宽度增加(处理更大矩阵)的原因主要是,问题解决路径(运算序列)使高速缓存数据得到了更有效的重复使用。

从图 17 可以看出:当您的问题处理数据集超过高速缓存系统的数据集时,您可以发现一些比简单的嵌套循环更加有效的解决路径。

在第 5 篇文章中,我们将探讨如何延伸性能曲线,以处理更大的矩阵。这会涉及更多的核心/CPU 和/或不同的解决路径吗?答案请见下一篇文章(第 5 部分)

Jim Dempsey
jim@quickthreadprogramming.com
www.quickthreadprogramming.com
有关编译器优化的更完整信息,请参阅优化通知
类别: