MM_PREFETCH 固有的访问行为 - Intel
Access behavior of MM_PREFETCH intrinsic - Intel
可用文档 here 提到指定地址可用的数据从内存带到缓存行(缓存级别作为提示提供)。
但是,我很困惑 LLC 是否也被访问(假设提示指定 L1D 或 L2)或者是否总是访问内存 - 无论数据是否可用有限责任公司
我问这个的原因是,在我的某些实验中,我发现使用 _mm_prefetch
内在增加了我的 LLC 负载计数(性能事件),即使我是获得整体性能优势。
预取可以在 LLC 中命中;如果它们在 L2 或 L3 中已经很热的情况下花费额外的 DRAM 流量将数据导入 L1d,那将是一个非常糟糕的设计。
此外,L3 中的副本可能是脏的,因此它无论如何都必须检查 L3 的正确性。
唯一真正的设计选择是数据是否添加到 L3,如果它不存在的话。在 Nehalem 之后的英特尔 CPU 上,在 Skylake-X 之前,, so there's no choice. ()
在 SKX 及更高版本上,通过核心和更小的非包容性 L3 之间的网状互连,prefetchnta
可以避免替换 L3 中的线路,如果它还不是很热的话,但其他预取仍然会选择像需求负载一样在缓存的外层填充数据。 (除了在预取提示中指定的任何缓存级别停止)。
可用文档 here 提到指定地址可用的数据从内存带到缓存行(缓存级别作为提示提供)。
但是,我很困惑 LLC 是否也被访问(假设提示指定 L1D 或 L2)或者是否总是访问内存 - 无论数据是否可用有限责任公司
我问这个的原因是,在我的某些实验中,我发现使用 _mm_prefetch
内在增加了我的 LLC 负载计数(性能事件),即使我是获得整体性能优势。
预取可以在 LLC 中命中;如果它们在 L2 或 L3 中已经很热的情况下花费额外的 DRAM 流量将数据导入 L1d,那将是一个非常糟糕的设计。
此外,L3 中的副本可能是脏的,因此它无论如何都必须检查 L3 的正确性。
唯一真正的设计选择是数据是否添加到 L3,如果它不存在的话。在 Nehalem 之后的英特尔 CPU 上,在 Skylake-X 之前,
在 SKX 及更高版本上,通过核心和更小的非包容性 L3 之间的网状互连,prefetchnta
可以避免替换 L3 中的线路,如果它还不是很热的话,但其他预取仍然会选择像需求负载一样在缓存的外层填充数据。 (除了在预取提示中指定的任何缓存级别停止)。