如何确保代码运行时不会因缓存而导致执行时间发生变化?

Ben*_*oit 5 time profiling caching processor

在具有硬实时约束的嵌入式应用程序(在 32 位处理器上用 C 语言编写)中,关键代码(特别是中断)的执行时间需要保持恒定。

如何确保代码执行过程中不会引入时间可变性,特别是由于处理器的缓存(无论是 L1、L2 还是 L3)?

请注意,我们关心缓存行为,因为它对执行速度有巨大影响(有时与访问 RAM 相比超过 100:1)。由于特定处理器架构而引入的可变性远不及高速缓存的大小。

Dar*_*enW 2

如果您能够接触到硬件,或者与能够接触到硬件的人合作,您就可以关闭缓存。有些 CPU 有一个引脚,如果连接到地而不是电源(或者可能是其他方式),将禁用所有内部缓存。这会带来可预测性,但不会带来速度!

如果做不到这一点,也许可以在软件代码的某些地方编写故意用垃圾填充缓存的方法,因此接下来发生的任何事情都可以保证是缓存未命中。如果做得好,这可以提供可预测性,并且也许只能在某些地方完成,因此速度可能比完全禁用缓存更好。

最后,如果速度确实很重要 - 仔细设计软件和数据,就像在古代 8 位 CPU 编程一样 - 保持它足够小,以使其全部适合 L1 缓存。我总是对现在的板载缓存比过去(十年前)小型计算机上的所有 RAM 还要大感到惊讶。但这将是一项艰苦的工作,需要聪明才智。祝你好运!