有没有办法检查处理器缓存最近是否已刷新?

2023-11-23

在 i386 linux 上。如果可能的话,最好在 c/(c/posix std libs)/proc 中。如果没有,是否有任何程序集或第三方库可以做到这一点?

编辑:我正在尝试开发测试内核模块是否清除缓存行或整个处理器(使用 wbinvd())。程序以 root 身份运行,但如果可能的话,我更愿意留在用户空间中。


缓存一致性系统会尽最大努力向您隐藏此类内容。我认为您必须间接观察它,要么使用性能计数寄存器来检测缓存未命中,要么通过高分辨率计时器仔细测量读取内存位置的时间。

该程序在我的 x86_64 机器上运行,以演示以下效果clflush。它计算读取全局变量所需的时间rdtsc。作为直接与 CPU 时钟相关的单个指令,可以直接使用rdtsc非常适合这个。

这是输出:



took 81 ticks
took 81 ticks
flush: took 387 ticks
took 72 ticks
  

您会看到 3 次试验:第一个确保i位于缓存中(确实如此,因为它只是作为 BSS 的一部分被归零),第二个是读取i那应该在缓存中。然后clflush kicks i出缓存(及其邻居)并显示重新读取它需要更长的时间。最终读取验证它是否已返回缓存。结果的重现性非常好,并且差异足够大,足以轻松查看缓存未命中情况。如果您想校准的开销rdtsc()你可以让差异变得更加明显。

如果你无法读取你想要测试的内存地址(尽管即使mmap of /dev/mem应该适用于这些目的)如果您知道缓存的缓存行大小和关联性,您也许能够推断出您想要的内容。然后,您可以使用可访问的内存位置来探测您感兴趣的集合中的活动。

源代码:

(1. Use static inline或者参考其他方法here如果使用较新的 gcc 2. 灵感来自comment,更好地利用asm volatile ("lfence;rdtsc;lfence" : "=a" (a), "=d" (d)::"memory");如果您的 CPU 可能会在运行时重新排序指令。这里volatile意味着不需要mfence around cflush为了保证 之后的指示cflush可以观察其效果)

#include <stdio.h>
#include <stdint.h>

inline void
clflush(volatile void *p)
{
    asm volatile ("clflush (%0)" :: "r"(p));
}

inline uint64_t
rdtsc()
{
    unsigned long a, d;
    asm volatile ("rdtsc" : "=a" (a), "=d" (d));
    return a | ((uint64_t)d << 32);
}

volatile int i;

inline void
test()
{
    uint64_t start, end;
    volatile int j;

    start = rdtsc();
    j = i;
    end = rdtsc();
    printf("took %lu ticks\n", end - start);
}

int
main(int ac, char **av)
{
    test();
    test();
    printf("flush: ");
    clflush(&i);
    test();
    test();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法检查处理器缓存最近是否已刷新? 的相关文章

  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • SIMD 和 VLIW 指令是一样的吗?

    SIMD 单指令多数据 和 VLIW 超长指令字 到底有什么区别 其中一个是另一个的子集吗 或者它们是两个完全不同的东西 完全不相关且正交 一台机器可以有一个或两个 或者两者都没有 SIMD 指令可以作为扩展添加到 VLIW ISA 但 V
  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack
  • 为什么X86中没有NAND、NOR和XNOR指令?

    它们是您可以在计算机上执行的最简单的 指令 之一 它们是我亲自实施的第一个指令 执行 NOT AND x y 会使执行时间和依赖链长度和代码大小加倍 BMI1 引入了 andnot 这是一个有意义的补充 是一个独特的操作 为什么不是这个问题
  • NPTL 和 POSIX 线程有什么区别?

    NPTL 和 POSIX 线程之间的基本区别是什么 这两者是如何演变的 POSIX 线程 pthread 不是一个实现 它是几个函数的 API 规范 纸上的标准 英文 其名称以pthread 以及定义在
  • 何时可以重用avx指令中的源寄存器

    在 avx 指令中用作源的寄存器何时可以在指令开始处理后重用 例如 我想使用vgatherdps该指令消耗两个 ymm 寄存器 其中之一是位移索引 我意识到vgatherdps由于数据的局部性较差 因此需要花费大量时间来收集 位移索引寄存器
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • PHP 脚本不断执行 mmap/munmap

    我的 PHP 脚本包含一个循环 它只不过是回显和取消引用指针 如 tab othertab i gt 中的内容 直到昨天 这个脚本开始变得非常慢 比以前慢了 50 倍 之前 它一直运行良好 使用 strace 后 我发现 90 的情况下 脚
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do

随机推荐

  • 如何在输入字段按键事件上添加等待计时器?

    我有一个输入字段 它有一个 keyup 事件 document ready function SearchInputBox keyup function DoSearch this val 如何添加延迟时间 以便只有当用户停止输入 1 秒时
  • BigQuery 相当于“CREATE TABLE my_table (LIKE your_table)”

    我想创建一个表 其架构与另一个表完全相同 在其他 SQL 引擎中 我认为我能够使用 CREATE TABLE my table LIKEyour table 或一些变体 我在 BigQuery 中还找不到对应的内容 这在某种程度上可能吗 使
  • 连接打开时更改串行端口波特率

    我正在使用 SerialPort 类与外部设备进行通信 我以每秒 300 波特率开始通信 但是在初始 握手 之后 我必须切换到设备指定的波特率 通常为 9600 Bps 在提高波特率后 我尝试继续通信失败 但我不确定为什么 这引出了我的问题
  • 使 $JAVA_HOME 在 Ubuntu 中轻松更改[关闭]

    Closed 这个问题是无关 目前不接受答案 在 Ubuntu 中 我想在 Java 5 和 6 之间来回切换 JAVA HOME 环境变量 我打开终端并输入以下内容来设置 JAVA HOME 环境变量 export JAVA HOME u
  • 检查每个Docker容器使用的资源

    如何检查 Ubuntu 服务器上运行的每个 Docker 容器使用的资源量 CPU 内存等 你有docker stats看医生 http docs docker com reference commandline stats 例如你可以做
  • 在特定视图上方显示 PopupWindow

    我想展示一个弹出窗口上面的相对布局 popupWindow showAtLocation layout Gravity BOTTOM Gravity CENTER 0 layout 其中layout是相对布局 但是它只出现在底部 而不是相对
  • 旋转 x 轴标签 FacetGrid seaborn 不起作用

    我正在尝试使用 python 中的seaborn 创建一个多面图 但我遇到了很多问题 其中一件事是旋转 x 轴标签 我目前正在尝试使用以下代码 import pandas as pd import seaborn as sns import
  • 如何将整数可移植地转换为字符串?

    我一直在寻找一种以可移植的方式将整数转换为字符串的方法 至少在 Windows 和 Linux 以及 x86 和 x86 64 之间可移植 但我想itoa X 成为标准就像atoi 1 但我在维基百科条目中读到以下内容 itoa 函数是标准
  • 当表单作为 multipart/form-data 发布时,UTF-8 文本出现乱码

    我正在将文件上传到服务器 文件上传 HTML 表单有 2 个字段 文件名 HTML 文本框 用户可以在其中以任何语言给出名称 文件上传 一个 HTMl 文件 用户可以在其中指定要从磁盘上传的文件 提交表单后 将正确接收文件内容 然而 当读取
  • ASP.NET应用程序池关闭问题

    有时异常会导致application pool去关机 我手动启动它 但问题是如何自动执行此行为IIS 7 0 Windows 服务器 2008 如果应用程序池终止 则对该池提供的资源的下一个请求将自动重新启动它 但是 如果您在应用程序池上启
  • AngularJs:如何解码 HTML 中的 HTML 实体? [复制]

    这个问题在这里已经有答案了 情况 我正在构建一个网页 其内容是通过调用以 json 格式返回数据的 API 来获取的 问题是 html 标签作为 HTML 实体给出 必须对其进行解码 EXAMPLE 这是我正在处理的 json 的示例 60
  • Android:打开 VPN 设置活动的操作

    我一直在寻找一种通过我的 Android 应用程序启动 VPN 设置活动的方法 但找不到它 请注意 我的目标是 Android 2 2 因此无法使用 android ICS 中提供的设施 为了打开 VPN 设置屏幕 我应该传递到 Inten
  • 如何确定我在 git 中签出了哪个分支?

    我使用克隆我的源git clone https gerrit wikimedia org r p mediawiki core git w 然后我通过执行指定特定的分支 标签git checkout
  • 安装服务时出现System.BadImageFormatException

    当我尝试运行安装程序来设置服务时 出现以下异常 InstallUtil Applications GasPosApp bin Wrapper exe s Applications GasPosApp properties Dispenser
  • 停止 NSRunLoop

    我在线程中有一个连接 因此我将其添加到运行循环中以获取所有数据 NSRunLoop currentRunLoop run connection scheduleInRunLoop NSRunLoop currentRunLoop forMo
  • 在 SQL Server 中匹配街道地址的方法有哪些?

    我们有一个街道地址列 枫树路123号第一大道 321 号ETC 有什么方法可以将这些地址与给定的输入相匹配吗 输入将是街道地址 但格式可能不同 例如 枫树路123号第一大道321号 我们的第一个想法是删除所有街道术语的输入 rd st av
  • postgresql 8.2 中的嵌套事务?

    我正在研究应用数据库架构更新的脚本 我已经使用启动事务 提交设置了所有 SQL 更新脚本 我在命令行上将这些脚本传递给 psql 我现在需要在一笔事务中同时应用多个脚本 到目前为止 我想出的唯一解决方案是从原始脚本集中删除启动事务 提交 然
  • 开发 ActiveX 控件

    我想开发一个 ActiveX 控件 但由于我没有 Visual Studio 我想知道是否可以单独使用 VisualC Express 版本 还是还需要 Windows Platform SDK 您不需要 Visual Studio 来编写
  • 当我们说 Hashtable 或 Vector 是同步的时,这意味着什么?

    这些问题说明了一切 只是想知道 在面试中 当他们问你 Hashtable 或 Vectors 同步实际上意味着什么 时 你会说什么 实际上它意味着两件事 不要使用它们 除非您要在线程之间共享它们 如果不只是使用 HashMap 或 Arra
  • 有没有办法检查处理器缓存最近是否已刷新?

    在 i386 linux 上 如果可能的话 最好在 c c posix std libs proc 中 如果没有 是否有任何程序集或第三方库可以做到这一点 编辑 我正在尝试开发测试内核模块是否清除缓存行或整个处理器 使用 wbinvd 程序