CUDA 11中引入的L2缓存accessPolicyWindow是什么
What is the L2 cache accessPolicyWindow introduced in CUDA 11
CUDA 11 中引入了新的运行时 API 以微调 L2 access policy。
但我并不完全理解 hitRatio
等政策的含义以及如何在实践中使用它们。
特别是,我在 CUDA API Documentation 中看到 cudaAccessPolicyWindow
:
Specifies an access policy for a window, a contiguous extent of memory
beginning at base_ptr and ending at base_ptr + num_bytes. Partition
into many segments and assign segments such that. sum of "hit
segments" / window == approx. ratio. sum of "miss segments" / window
== approx 1-ratio. Segments and ratio specifications are fitted to the capabilities of the architecture. Accesses in a hit segment apply the
hitProp access policy. Accesses in a miss segment apply the missProp
access policy.
我的问题:
内存的连续范围是如何“分区”成段的?这些分区是基于 hit 属性静态决定的,以便段的命中或未命中属性在分配后将保持不变,或者有一些 运行 计数器动态调整分配,例如在每个访问基础上?
在实践中应该如何应用这些属性来优化性能?例如。以一种过于简单和天真的方式来说,假设我预留了 1 MB 二级缓存,我应该为我最常用的数据创建一个 1 MB 的 window 并将 hitRatio 设置为 1 还是应该创建一个window 的 2 MB 并将 hitRatio 设置为 0.5?为什么?
How is the contiguous extent of memory "partitioned" into segments? Are these partitions decided statically based on the hit prop such that the hit or miss attribute of segments will remain unchanged once they are assigned or there are some running counters which dynamically adjust the assignment e.g. on each access basis?
我认为这些都没有被明确指定。然而,我们可以根据两个想法做出一些非常可靠的(我相信)猜想:
NVIDIA GPU L2 高速缓存“很长一段时间”的基本行大小为 32 字节。这旨在与具有 32 字节段边界的 DRAM 子系统的设计保持一致。
documentation 声明选择哪些行作为“随机”选择在缓存中持久化。这几乎意味着它与访问模式无关。
综合这些想法,然后我会说分区的粒度不小于 L2 行(32 字节),如果 L2 tag/TLB 系统需要,它可能是更高的粒度. NVIDIA 通常不会发布这些 L2 详细信息中的大部分。一旦随机选择,我不希望选择会根据访问模式而改变。
How should these attributes be applied to optimize performance in practice? E.g. to put it in a over-simplified & naive way, suppose I have 1 MB L2 cache set aside, should I create a window of 1 MB for my most frequently used data and set hitRatio as 1 or should I create a window of 2 MB and set hitRatio as 0.5? Why?
没有足够的信息来给出这个问题的具体答案。您决定预留 1MB 二级缓存的知识是第一个关键信息,但第二个关键信息是您实际需要缓存多少数据?此外,预期的访问模式很重要。让我们介绍几种情况:
预留 1MB 缓存,1MB window,hitRatio 1。这意味着您只有 1MB 的数据要使用此机制缓存。使用 1MB 缓存和 1MB window,没有任何理由为 hitRatio 选择 1 以外的任何值。如果您只有 1MB 的数据要缓存,并且您有能力分出 1MB 的 L2,那么这是一个完全明智的选择。你基本上保证没有其他 activity 可以“驱逐”这个“受保护”的数据,一旦它出现在缓存分割中。
预留 1MB 缓存,2MB window,hitRatio 0.5。这当然意味着您至少有 2MB 的数据要使用此机制缓存,因此这不能直接与上面的情况 1 进行比较。 0.5 的 hitRatio 可以被认为是防止抖动的“守卫”。让我们考虑几个子案例:
一个。假设你的 2MB 数据被分成 1MB 的区域 A 和 B,你的代码访问区域 A 中的所有数据(一次),然后是区域 B 中的所有数据(一次),然后是区域 A 中的所有数据(一次),等等。如果您选择 1 的命中率,分配 1MB 缓存但 2MB window,则此设置会失败。您将使用区域 A 填充缓存,然后逐出并填充区域 B,然后逐出并填充区域 A,等等。如果没有“hitRatio”mechanism/control,这种情况下的这种行为将是不可避免的。因此,如果您预期这种循环访问模式,则 0.5 的命中率会更好(50% 的数据访问将受益于 L2 分割,50% 不会)而不是根本没有从缓存中受益。
乙。假设您的 2MB 数据是通过高时间局部性访问的。您的代码重复访问 2MB 数据中的 1MB(例如,区域 A),然后重复访问另一个(区域 B)。在这种情况下,可能根本不需要分拆。如果您想使用分割,命中率为 1 可能有意义,因为这意味着此分割的行为或多或少与普通缓存相同,但可缓存 window 是用户定义的除外.在此示例中,您的缓存将填满您的前 1MB 区域 A 数据,然后您的代码将受益于缓存,因为它会重用该数据。当您的代码切换模式并开始使用第二个 1MB 数据(区域 B)时,第二个 1MB 将逐出前 1MB,然后当您的代码重复使用第二个 1MB 时,它将再次从缓存中获得 100% 的收益。
CUDA 11 中引入了新的运行时 API 以微调 L2 access policy。
但我并不完全理解 hitRatio
等政策的含义以及如何在实践中使用它们。
特别是,我在 CUDA API Documentation 中看到 cudaAccessPolicyWindow
:
Specifies an access policy for a window, a contiguous extent of memory beginning at base_ptr and ending at base_ptr + num_bytes. Partition into many segments and assign segments such that. sum of "hit segments" / window == approx. ratio. sum of "miss segments" / window == approx 1-ratio. Segments and ratio specifications are fitted to the capabilities of the architecture. Accesses in a hit segment apply the hitProp access policy. Accesses in a miss segment apply the missProp access policy.
我的问题:
内存的连续范围是如何“分区”成段的?这些分区是基于 hit 属性静态决定的,以便段的命中或未命中属性在分配后将保持不变,或者有一些 运行 计数器动态调整分配,例如在每个访问基础上?
在实践中应该如何应用这些属性来优化性能?例如。以一种过于简单和天真的方式来说,假设我预留了 1 MB 二级缓存,我应该为我最常用的数据创建一个 1 MB 的 window 并将 hitRatio 设置为 1 还是应该创建一个window 的 2 MB 并将 hitRatio 设置为 0.5?为什么?
How is the contiguous extent of memory "partitioned" into segments? Are these partitions decided statically based on the hit prop such that the hit or miss attribute of segments will remain unchanged once they are assigned or there are some running counters which dynamically adjust the assignment e.g. on each access basis?
我认为这些都没有被明确指定。然而,我们可以根据两个想法做出一些非常可靠的(我相信)猜想:
NVIDIA GPU L2 高速缓存“很长一段时间”的基本行大小为 32 字节。这旨在与具有 32 字节段边界的 DRAM 子系统的设计保持一致。
documentation 声明选择哪些行作为“随机”选择在缓存中持久化。这几乎意味着它与访问模式无关。
综合这些想法,然后我会说分区的粒度不小于 L2 行(32 字节),如果 L2 tag/TLB 系统需要,它可能是更高的粒度. NVIDIA 通常不会发布这些 L2 详细信息中的大部分。一旦随机选择,我不希望选择会根据访问模式而改变。
How should these attributes be applied to optimize performance in practice? E.g. to put it in a over-simplified & naive way, suppose I have 1 MB L2 cache set aside, should I create a window of 1 MB for my most frequently used data and set hitRatio as 1 or should I create a window of 2 MB and set hitRatio as 0.5? Why?
没有足够的信息来给出这个问题的具体答案。您决定预留 1MB 二级缓存的知识是第一个关键信息,但第二个关键信息是您实际需要缓存多少数据?此外,预期的访问模式很重要。让我们介绍几种情况:
预留 1MB 缓存,1MB window,hitRatio 1。这意味着您只有 1MB 的数据要使用此机制缓存。使用 1MB 缓存和 1MB window,没有任何理由为 hitRatio 选择 1 以外的任何值。如果您只有 1MB 的数据要缓存,并且您有能力分出 1MB 的 L2,那么这是一个完全明智的选择。你基本上保证没有其他 activity 可以“驱逐”这个“受保护”的数据,一旦它出现在缓存分割中。
预留 1MB 缓存,2MB window,hitRatio 0.5。这当然意味着您至少有 2MB 的数据要使用此机制缓存,因此这不能直接与上面的情况 1 进行比较。 0.5 的 hitRatio 可以被认为是防止抖动的“守卫”。让我们考虑几个子案例:
一个。假设你的 2MB 数据被分成 1MB 的区域 A 和 B,你的代码访问区域 A 中的所有数据(一次),然后是区域 B 中的所有数据(一次),然后是区域 A 中的所有数据(一次),等等。如果您选择 1 的命中率,分配 1MB 缓存但 2MB window,则此设置会失败。您将使用区域 A 填充缓存,然后逐出并填充区域 B,然后逐出并填充区域 A,等等。如果没有“hitRatio”mechanism/control,这种情况下的这种行为将是不可避免的。因此,如果您预期这种循环访问模式,则 0.5 的命中率会更好(50% 的数据访问将受益于 L2 分割,50% 不会)而不是根本没有从缓存中受益。
乙。假设您的 2MB 数据是通过高时间局部性访问的。您的代码重复访问 2MB 数据中的 1MB(例如,区域 A),然后重复访问另一个(区域 B)。在这种情况下,可能根本不需要分拆。如果您想使用分割,命中率为 1 可能有意义,因为这意味着此分割的行为或多或少与普通缓存相同,但可缓存 window 是用户定义的除外.在此示例中,您的缓存将填满您的前 1MB 区域 A 数据,然后您的代码将受益于缓存,因为它会重用该数据。当您的代码切换模式并开始使用第二个 1MB 数据(区域 B)时,第二个 1MB 将逐出前 1MB,然后当您的代码重复使用第二个 1MB 时,它将再次从缓存中获得 100% 的收益。