我有以下问题:我有一个低延迟应用程序在核心 0 上运行,一个常规应用程序在核心 1 上运行。我想确保核心 0 应用程序获得尽可能多的缓存,因此,我想核心 1 绕过 L3 缓存(根本不使用它)并直接进入内存中获取数据。
有没有其他方法可以让 core 0 应用程序优先使用 L3 缓存?
一些 Intel CPU 支持在不同的工作负载或 VM 之间划分 L3 缓存,缓存分配技术 (CAT)。它从 Haswell Xeon (v3) 开始就得到支持,显然是第 11 代台式机/笔记本电脑 CPU。
大概你需要让每个工作负载都有 some L3,甚至可能在 Skylake-Xeon 和后来的 L3 是非包容性的地方,但你可以给它一个相当小的份额并仍然实现你的目标。
更一般地说,https://github.com/intel/intel-cmt-cat 有工具(用于 Linux 和一些用于 FreeBSD)来管理它和英特尔现在称为“资源导向技术(RDT)”的其他部分用于监控、CAT 和内存带宽分配。它还具有按 CPU 划分的功能表。
您所描述的内容在台式机 Intel CPU(或 Skylake 之前的 Xeon)上几乎是不可能的,因为它们使用包容性 L3 缓存:一条线只能在 L2/L1 中,如果它在 L3 中(至少是标签,如果是数据则不能)核心使其处于修改或独占状态)。 Skylake-X 和后来的至强处理器具有非包容性 L3,因此理论上是可能的; IDK 如果 CAT 让你给一组核心零 L3。
我不知道是否有任何AMD或ARM CPU有类似的东西。我只是碰巧知道英特尔对此有硬件支持,而不是我自己寻找或使用过的东西。
关于 AMD Epyc:如果您可以将低延迟应用程序移动到一个独立的核心复合体中,那就太好了。
在 Zen 2 中,4 个内核共享一个 16 MB 的 L3 片。在 Zen 3 中,8 个内核共享一个 32 MB 的片。确保您的低延迟应用程序是唯一可以触及其运行的内核的 L3 切片的应用程序。