我在这里阅读了有关缓存如何工作的基础知识:How and when to align to cache line size?在这里:What is "cache-friendly" code? ,但这些帖子都没有回答我的问题:有没有一种方法可以在缓存中完全执行一些代码,即不使用任何对 RAM 的访问(可能超出从硬盘)?据我了解,现在计算的瓶颈主要是内存带宽,“只要你在 CPU 之内,你就没事”。
有没有办法将程序加载到缓存中,并一直保存到它终止?假设我有一个 1MB 的已编译 C 程序,它需要另外 1MB 的内存来进行一些科学计算,并运行 5 天。有没有办法标记这段代码,以便它在评估期间不会从缓存中消失?我正在考虑在执行期间给予此代码更高的优先级或类似的优先级。
换句话说,一台空闲的计算机使用了多少缓存,它加载了它的操作系统(比如 Ubuntu),然后什么都不做?闲置期间是否有过多的缓存使用?如果操作系统除了执行它之外什么都不做,我是否应该期望我的小程序总是在缓存中?假设 5 分钟后屏幕保护程序启动。这是否会导致大量缓存未命中(并因此导致性能急剧下降),因为现在它与我的程序竞争缓存空间?我的经验表明,同时运行多个要求不高的程序(如屏幕保护程序、简单的音频播放器、pdf 阅读器等)不会显着降低我的科学程序的性能,尽管我预计它会一直从缓存中进出。问题是:为什么它的速度没有受到影响?使用绝对简约的操作系统(如果是,那么是哪个?)来提高(或者更确切地说:保持)计算速度是否有意义?
为了清楚起见,我们可以假设代码非常简单,假设它是一堆嵌套的 for 循环,其中最里面的部分将所有增量变量相加以模 97 求和。要点是它足够小,可以放在缓存中执行。
最佳答案
有different types of CPU cache misses :强制、冲突、能力、连贯性。
强制性缺失无法避免,因为它们发生在第一次引用内存中的某个位置时。所以不,您绝对无法完全避免缓存未命中。
除此之外,当今典型的 L1 缓存大小为每个内核 32KB/64KB,L2 缓存大小为每个内核 256KB。因此,1MB 的数据也会产生容量或冲突未命中,具体取决于缓存的关联性。
关于c - 有没有办法_完全_避免缓存未命中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25984553/