memory - 判断内存位置是否在 CPU 缓存中

标签 memory assembly caching cpu fault

操作系统可以确定内存页是在 DRAM 中还是在交换中;例如,只需尝试访问它,如果发生页面错误,则不会。

但是,CPU 缓存是否可以实现相同的功能?

是否有任何有效的方法来判断给定的内存位置是否已加载到缓存行中,或者知道它何时加载?

最佳答案

总的来说,我认为这是不可能的。它适用于 DRAM 和页面文件,因为这是操作系统管理的资源,缓存由 CPU 本身管理。

操作系统可以对内存读取进行严格的计时循环,并尝试查看它是否以足够快的速度完成以进入缓存,或者它是否必须输出到主内存 - 这很容易出错。

在多核/多进程系统上,有 cache coherency protocols在处理器之间用于确定何时需要使彼此的缓存失效,我想您可以拥有一个自定义设备来监听操作系统将查询的此协议(protocol)。

你想做什么?如果你想强制某些东西进入内存,当前的 x86 处理器支持以非阻塞方式将内存预取到缓存中,例如在 Visual C++ 中你可以使用 _mm_prefetch获取一行到缓存中。

编辑: 我自己没有这样做,所以使用风险自负。要确定用于分析的缓存未命中,您可以使用一些特定于体系结构的寄存器。 http://download.intel.com/design/processor/manuals/253669.pdf ,附录 A 给出了“性能调整事件”。这不能用于确定单个地址是否在缓存中或何时加载到缓存中,但可用于总体统计信息。我相信这就是 vTune(这个级别的出色分析器)使用的。

关于memory - 判断内存位置是否在 CPU 缓存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/683023/

相关文章:

c++ - 在Windows中获得准确的堆使用情况(用于在单个进程中调试内存泄漏)

c++ - 如何确定机器上的硬件(CPU 和 RAM)?

memory - Tomcat内存问题

assembly - 常量乘法 - imul 或 shl-add-combination

assembly - JB在这里是做什么用的?

jakarta-ee - 使用 Java EE BeanManager 作为单例

java - Spring 3.1缓存——如何在SpEL中使用返回值

python - Heroku Web dyno 运行 Django 应用程序不释放内存

ubuntu - x86 NASM 程序集中的阶乘函数出错

c# - 从 Redis 缓存数据库中获取所有键