有没有办法避免缓存未命中_completely_?

时间:2014-09-22 23:23:25

标签: c performance caching scientific-computing

我在这里阅读了有关缓存如何工作的基础知识:How and when to align to cache line size?和此处:What is "cache-friendly" code?,但这些帖子都没有回答我的问题:有没有办法完全执行某些代码 在缓存中,即不使用任何访问RAM(可能在从HDD读取文件的初始过程中)?据我所知,现在的计算瓶颈主要是内存带宽,而且只要你在CPU内,你就可以了。#/ p>。

有没有办法将程序加载到缓存中,并将其保留在那里直到它终止?所以,让我们说我有一个1MB的编译C程序,它进行一些科学计算,内存需求另外1MB,运行5天。有没有办法标记这个代码,以便它在评估期间不会从缓存中出来?我想在执行期间给予此代码更高的优先级,或类似。

换句话说,一个空闲计算机使用了多少缓存,它加载了它的操作系统(比如Ubuntu),然后什么都不做?空闲时是否有过多的缓存使用?如果操作系统除了执行操作系统之外什么都不做,我是否应该期望我的小程序总是在缓存中?让屏幕保护程序启动5分钟后再说。这是否导致大量缓存未命中(因此,性能急剧下降),因为现在它与我的程序竞争缓存空间?我的经验表明,同时运行几个不苛刻的程序(如屏幕保护程序,或简单的音频播放器,pdf阅读器等)不会显着降低我的科学计划的性能,即使我希望它会从缓存中随时进出。问题是:为什么它的速度不受影响?使用绝对简约操作系统(如果是,那么哪一个?)来改善(或者更确切地说:维持)计算速度是否有意义?

为了清楚起见,我们可以假设代码是非常简单的东西,比如它是一堆嵌套的for循环,其中最里面的部分总结了模97的所有增量变量。点是它足够小,可以在缓存中放置和执行。

5 个答案:

答案 0 :(得分:1)

简短回答:不。缓存由OS / CPU维护,允许程序强制自己保留在缓存中是一个坏主意。让我们说你有2个程序同时运行,并且都试图强制留在缓存中,混乱会发生不是吗?

答案 1 :(得分:1)

不,在大多数标准体系结构中,CPU缓存无法寻址。 *

即使你可以,你在这里期待什么样的性能提升?您认为从主内存加载到(L3)缓存所花费的程序执行时间的百分比是多少?您应该分析您的程序以确定它实际花费时间的位置,而不是梦想解决不存在的问题!

<小时/> *我认为x86 CPU 可能具有硬件配置,允许它们在没有连接RAM的情况下运行,但这基本上是不相关的。

答案 2 :(得分:1)

different types of CPU cache misses:强制性,冲突,能力,连贯性。

强制性失误无法避免,因为它们发生在对内存中某个位置的第一次引用上。所以不,你绝对不能完全避免缓存未命中

除此之外,目前典型的L1高速缓存大小为每核32KB / 64KB,L2高速缓存大小为每核256KB。因此,1MB的数据也会产生容量或冲突未命中,具体取决于缓存的关联性。

答案 3 :(得分:1)

较新的Intel CPU在其Resource Director Technology的一般标题下添加了“缓存分配技术”(CAT)。这允许软件指令为特定计算单元(应用程序,容器,VM等)保留某些缓存(和其他)资源。因此,如果有问题的进程在CAT下为其预留了足够的缓存空间,它应该只经历其最初的强制性未命中(将其代码和数据带入缓存)和自我引发的冲突未命中,避免容量错失和创建的冲突未命中通过其他过程。

答案 4 :(得分:0)

我不确定它是否能满足你的要求。

有没有办法在缓存中完全执行一些代码,即不使用任何RAM访问? 有没有办法将程序加载到缓存中,并将其保留在那里直到它终止?

可以使用全关联缓存(例如,紧耦合存储器),它具有单周期访问时间。(这在非常小的嵌入式系统中是现实的。)在嵌入式系统中使用TCM是一种通用做法。时间关键代码,因为它提供了可预测性。

在部分关联缓存的情况下,可以锁定缓存行或方式(例如,在ARM中使用CP15),因此驱逐算法不会将它们视为缓存填充的受害者。

作为旁注,当缓存处于调试模式时,有时使用Cache作为Ram来启动非启动板。 (http://www.asset-intertech.com/Products/Processor-Controlled-Test/PCT-Software/Cache-as-RAM-for-board-bring-up-of-non-boothing-ci