用户空间程序中的变量是否可以固定到缓存位置?
答案 0 :(得分:3)
@MetallicPriest,你保持在没有激励他们的情况下提出神秘的问题 ..... 在这里提问时,你应该尝试,用一个简短的&准确的短语 - 你做得非常好 - 然后来激励并提出你的问题的背景在一个完整的段落中(你永远不会这样做,你真的应该这样做)。如果可能的话,还要指出神秘软件的当前状态(例如公共GIT存储库)。
AFAIK,对于Linux上的应用程序(至少是x86或AMD64),处理器缓存(如果你说的是这个缓存)几乎不存在(即从应用程序的角度看不是真的可见)
但是,该进程可能(或没有)有一些机器指令来处理缓存。 AFAIK,这些是特定型号的(即AMD Phenom处理器的行为可能与Intel i7不同)。
幸运的是,最新的 GCC编译器(优化时)生成缓存相关指令。它还为您提供了一些__builtin___clear_cache
__builtin_prefetch
或gcc
。但是,请注意这些内置版本具有不精确的含义,并以各种方式实现,可能取决于您cache related builtins和volatile
{{1}}
可能GCC的{{1}}属性可能会帮助你w.r.t。缓存(通过“删除”)。
最后,变量(在Linux上的应用程序中)不能总是保留在缓存中。例如,由于上下文切换由内核启动,因此高速缓存行将不时被另一个进程(及其数据)使用。实际上,内核甚至有时会将一个活动进程从一个核心移动到另一个多核桌面处理器!
答案 1 :(得分:2)
通常,可以在大多数现代CPU上以某种方式执行此操作;通过在CPU中使用显式支持(80x86不支持),通过黑客攻击(例如将其加载到缓存中然后禁用现代80x86上的缓存行填充),或者通过阻止其他数据导致缓存行/被驱逐出去。其他方法(例如定期用“CLFLUSH”敲出CPU中的日光)。
然而,“一般”并不意味着“特别针对Linux”。我怀疑Linux支持这些东西,特别是对于用户空间进程。
我怀疑Linux支持它的原因是Linux(或任何其他通用操作系统)没有理由支持它。如果经常使用某些东西,那么无论如何它都会在CPU的缓存中;如果没有经常使用某些东西,那么你不希望它浪费在缓存中的空间并减慢其他一切。
只有3个理智的理由。第一个是在RAM芯片初始化之前运行的固件代码(我怀疑这里适用)。第二个原因是极端“硬实时”,其中不能容忍高速缓存未命中的额外延迟(我怀疑这适用于此并且可能不适用于任何其他地方)。第三个原因是解决特殊情况,其中正常的“最近使用的”缓存驱逐策略导致问题(如缓存污染),其中有更好的方法来解决/避免这些问题(例如,防止不必要的数据被缓存,或者在进入缓存后立即冲洗它。)
基本上,我建议你认为你可能想强迫一些东西留在缓存中,但实际上你不想强迫某些东西留在缓存中。
答案 2 :(得分:-1)
很抱歉,但据我所知,这不能在用户空间中完成,只能在内核空间中完成。