c - 有没有办法_完全_避免缓存未命中?

标签 c performance caching scientific-computing

我在这里阅读了有关缓存如何工作的基础知识: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/

相关文章:

wpf - WPF- ItemsControl的ListView与TextBoxes性能问题

sql-server - 如何优化运行数百万条记录的 SQL Server Merge 语句

计算 Sandy Bridge 上的整数运算

ruby-on-rails - 如何在测试环境中设置 dalli 缓存?

asp.net-mvc - 将缓存破坏者添加到非优化包?

c - 我想打印输入字符串中以空格分隔的单词

c - 我有一个 csv 文件,我想将数据放入结构中,但我不知道为什么它只保留最后一行

c - 如何将 c 代码 fread 转换为 vb.net

C Socket Send() 直到程序终止才发送

django - 缓存如何影响内存消耗?