Volkov 和 Demmel 如何通过实验确定 GPU 的延迟、行大小和页面大小?

计算科学 表现 显卡 基准测试
2021-12-16 10:50:04

Vasily Volkov 和 James Demmel 的“使用 GPU 的向量能力的 LU、QR 和 Cholesky 分解”中,有一种有趣的方法可以从如下图解释缓存的延迟、行大小和页面大小:

图 1 来自论文

显然,行大小是缓存开始稳定的地方(在本例中约为 32 个字节)。那个是从哪里来的?

我们怎么知道页面大小是全局内存的第二个平台开始的地方?

此外,为什么延迟最终会随着步幅足够大而下降?他们不应该继续增加吗?

如果这真的有效,而且看起来有效,那就太棒了,因为我们可以获得大量关于 GPU 缓存的无证数据。

2个回答

如果这真的有效,而且看起来有效,那就太棒了,因为我们可以获得大量关于 GPU 缓存的无证数据。

高性能计算研究的一个令人沮丧的方面是在尝试调整代码时挖掘所有未记录的指令集和架构特性。在 HPC 中,无论是高性能 Linpack 还是 STREAMS,证明都在基准测试中。我不确定这是否“很棒”,但这绝对是评估和评估高性能处理单元的方式。

显然,行大小是缓存开始稳定的地方(在本例中约为 32 个字节)。那个是从哪里来的?

您似乎熟悉缓存层次结构的性能概念,在 Bryant 和 O'Hallaron 的计算机系统:程序员的视角中被描述为“内存山” ,但您的问题表明缺乏对每个级别缓存本身的深入了解作品。

记忆山

回想一下,高速缓存包含数据“行”,即与主存储中某处的内存位置协调的连续内存条。当访问一行内的内存时,我们有一个缓存“命中”,与检索此内存相关的延迟称为该特定缓存的延迟。例如,10 个周期的 L1 缓存延迟表示每次请求的内存地址已经在 L1 缓存线之一中时,我们将期望在 10 个周期内检索它。

从指针追踪基准的描述中可以看出,它在内存中采用固定长度的步幅。 注意:在许多现代 CPU 中,这个基准测试不会像预期的那样工作,这些 CPU 具有“流检测”预取单元,这些单元的行为不像简单的缓存。

那么,第一个明显的性能平台(从步幅 1 开始)是一个步幅,没有从以前的缓存未命中中得到重用,这是有道理的。跨步需要多长时间才能完全越过先前检索的缓存行?缓存行的长度!

我们怎么知道页面大小是全局内存的第二个平台开始的地方?

类似地,超越重用的下一个平台将是操作系统管理的内存页面必须与每个内存访问进行交换。与高速缓存行大小不同,内存页大小通常是可由程序员设置或管理的参数。

此外,为什么延迟最终会随着步幅足够大而下降?他们不应该继续增加吗

这绝对是您问题中最有趣的部分,它解释了作者如何根据他们先前收集的信息(缓存行的大小)和工作集的大小来假设缓存结构(关联性和集合数)他们正在跨越的数据。回想一下实验设置,步幅“环绕”数组。对于足够大的步幅,需要保存在缓存(所谓的工作集)中的数组数据总量较小,因为数组中的更多数据被跳过。为了说明这一点,你可以想象一个人不断地上下楼梯,每走四步。这个人的总步数比每两步走的人少。这个想法在论文中表述得有些尴尬:

当步幅非常大时,工作集会减少,直到它再次适合缓存,如果缓存不是完全关联的,这一次会产生冲突未命中。

正如比尔巴特在他的回答中提到的那样,作者在论文中说明了他们是如何进行这些计算的:

图 1 中的数据表明完全关联的 16 项 TLB(128MB 阵列没有 TLB 开销,8MB 步长)、20 路组关联 L1 缓存(1KB 步长的 20KB 阵列适合 L1)和 24 路设置关联 L2 缓存(返回到 768KB 阵列的 L2 命中延迟,32KB 步幅)。这些是有效数字,实际实施可能会有所不同。六个 4 路组关联 L2 缓存也与此数据匹配。

我想说的是第 3 页上以“更大的延迟表示更多的缓存未命中”开头的段落。很好地解释了您要问的大部分内容。