CUDA 11引入了新的运行时API,以微调L2访问策略。
但我不完全理解像`hitRatio`这样的策略的含义,以及它们在实践中如何使用。
特别是,在CUDA API文档中我看到了`cudaAccessPolicyWindow`:
指定窗口的访问策略,该窗口是从base_ptr开始并以base_ptr + num_bytes结束的连续内存范围。将其分成许多段并分配段,使得"命中段"的总和/窗口≈比率,"未命中段"的总和/窗口≈1-比率。段和比例规格适合架构的功能。命中段中的访问采用hitProp访问策略。未命中段中的访问采用missProp访问策略。
我的问题是:
内存的连续区域是如何被“分割”成段的?这些分段是基于命中属性静态决定的,使得一旦它们被分配,它们的命中或未命中属性将保持不变,还是有一些运行计数器动态调整分配,例如在每次访问时基础上?
在实践中,应该如何应用这些属性以优化性能?例如,假设我有1 MB的L2缓存,我应该为我的最常用数据创建一个1 MB的窗口,并将命中率设置为1,还是应该创建一个2 MB的窗口,并将命中率设置为0.5?为什么?
但我不完全理解像`hitRatio`这样的策略的含义,以及它们在实践中如何使用。
特别是,在CUDA API文档中我看到了`cudaAccessPolicyWindow`:
指定窗口的访问策略,该窗口是从base_ptr开始并以base_ptr + num_bytes结束的连续内存范围。将其分成许多段并分配段,使得"命中段"的总和/窗口≈比率,"未命中段"的总和/窗口≈1-比率。段和比例规格适合架构的功能。命中段中的访问采用hitProp访问策略。未命中段中的访问采用missProp访问策略。
我的问题是:
内存的连续区域是如何被“分割”成段的?这些分段是基于命中属性静态决定的,使得一旦它们被分配,它们的命中或未命中属性将保持不变,还是有一些运行计数器动态调整分配,例如在每次访问时基础上?
在实践中,应该如何应用这些属性以优化性能?例如,假设我有1 MB的L2缓存,我应该为我的最常用数据创建一个1 MB的窗口,并将命中率设置为1,还是应该创建一个2 MB的窗口,并将命中率设置为0.5?为什么?