超低延迟硬实时多线程 x86 代码的意外周期性行为

2024-04-10

我正在具有 RT 优先级的专用 CPU 上循环运行代码以进行多次迭代,并希望长时间观察其行为。我发现代码有一个非常奇怪的周期性行为。

简而言之,这就是代码的作用:

Arraythread
{
    while(1)
    {
        if(flag)
            Multiply matrix
            record time;
            reset flag;
    }
}

mainthread
{
    for(30 mins)
    {
        set flag;
        record time;
        busy while(500 μs)
    }
}

以下是我正在使用的机器的详细信息:

  • CPU:Intel(R) Xeon(R) Gold 6230 CPU @ 2.10 GHz
  • L1 缓存:32K d 和 32K i
  • 二级缓存:1024K
  • 三级缓存:28160K
  • 内核:3.10.0-693.2.2.rt56.623.el7.x86_64 #1 SMP 抢占 RT
  • 操作系统:CentOS
  • 当前活动配置文件:延迟性能
  • 我将Linux实时调度(sched_rt_runtime_us)的全局限制从95%修改为100%
  • 上述两个线程都绑定在单个 NUMA 节点上,每个线程的优先级均为 99

有关代码的更多详细信息:

  • 主线程每 500 μs 设置一个标志。我使用 CLOCK_MONOTOMIC_RAW 和 Clock_gettime 函数来读取时间(假设为 T0)。
  • 我将所有变量放在一个结构中以减少缓存未命中。
  • Arraythread 运行一个繁忙的 while 循环并等待设置标志。
  • 一旦设置了标志,它就会将两个大数组相乘。
  • 乘法完成后,它会重置标志并记录时间(假设为 T1)。
  • 我运行这个实验 30 分钟(= 3600000 次迭代)
  • 实验结束后,我测量时间差 T1-T0。

Here is the clock: enter image description here

时钟的平均时间约为 500.5 微秒。预计会有波动。

Here is the time taken by the array multiplication: enter image description here

  • 这是完整的 30 分钟结果视图。
  • 结果中有四个峰值。第一个峰值是预期的,因为数据第一次来自主内存并且 CPU 处于睡眠状态。
  • 除了第一个峰值之外,还有三个峰值,peak_3 和peak_2 之间的时间差为11.99364 分钟,其中peak_4 和peak_3 之间的时间差为11.99358 分钟。 (我假设时钟为 500 微秒)

如果我进一步放大:

  • 此图显示了 5 分钟内发生的情况。

如果我进一步放大:

  • 此图显示了大约 1.25 分钟内发生的情况。
  • 您注意到乘法的平均时间约为 113 微秒,并且到处都有峰值。

如果我进一步放大:

  • 此图显示了 20 秒内发生的情况。

如果我进一步放大:

  • 此图显示了 3.5 秒内发生的情况。
  • 这些峰值的起始线之间的时间差为:910 ms、910 ms、902 ms(假设两个连续点相差 500 μs)

If I zoom it further: enter image description here

  • 此图显示了 500 毫秒内发生的情况
  • ~112.6 μs 是此处的平均时间,完整数据在 1 μs 范围内。

这是我的问题:

  • 鉴于 L3 缓存足以存储完整的可执行文件,并且没有文件读取权限,并且机器上没有其他任何东西正在运行,也没有发生上下文切换,为什么某些执行几乎需要双倍时间(或者有时超过两倍)时间? [查看第一个结果图像中的峰值]
  • 如果我们忘记第一张图像中的这四个峰值,我如何证明结果中的周期性峰值具有几乎恒定的时间差? CPU 的作用是什么?这些周期性峰值持续几毫秒。
  • 我预计结果会像最后一张图片一样接近恒定。有没有一种方法或操作系统/CPU 设置可以应用来像最后一个图像一样无限时间地运行代码?

这是完整的代码: https://github.com/sghoslya/kite/blob/main/multiThreadProfCheckArray.c https://github.com/sghoslya/kite/blob/main/multiThreadProfCheckArray.c


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

超低延迟硬实时多线程 x86 代码的意外周期性行为 的相关文章

  • 如何在 Ubuntu/Linux 发行版中安装 Tesseract-OCR 3.03?

    我和一个朋友有兴趣为 CV 项目训练 tesseract OCR 引擎 我们尝试使用一些包装器 例如 PyTesser 和 pyocr 但结果目前不如我们需要的那么准确 因此 我们希望尝试训练超立方体以更好地实现我们的目的 即识别食品标签上
  • 打印 STDOUT/STDERR 并将它们写入 Bash 中的文件?

    有没有办法让 Bash 将 STDOUT STDERR 重定向到文件 但仍然将它们打印到终端 这会将 STDOUT 和 STDERR 重定向到同一个文件 some command 2 gt 1 tee file log Example to
  • 使用 .htaccess 启用 PHP 短标签

    我在自己的 Centos 服务器上设置了 Apache 并具有多个虚拟 Web 服务器 并且我希望仅为位于以下位置的其中一个 Web 服务器启用 PHP 短标记 var www ostickets html 我可以通过添加成功启用短标签sh
  • 线程池的 lambda 函数内的编译器错误变量“未捕获”

    我正在学习 C 中的多线程 并尝试设置线程池 但收到编译器错误 提示 错误 未捕获 mapperNodes 和 错误 未捕获 command 我读过一些关于使用 this 捕获 lambda 中的变量的内容 但到目前为止没有任何效果 如何在
  • PHP mail() 函数不发送邮件

    我有一个小问题 我正在使用一个工作脚本 在我的测试帐户 共享服务器上工作 使用 mail 函数通过 PHP 发送邮件 我刚刚得到了一个专用服务器 但我还无法让该功能发挥作用 在过去的 10 个小时左右的时间里 我阅读了有关 BIND 用于
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 进程如何知道它已收到信号

    如果我错了 请纠正我 以下是我对信号的理解 据我所知 信号生成 和信号传递有2个不同 事物 为了产生信号 操作系统只是在位数组中设置一个位 在过程控制中维护 工艺块 PCB 每一位 对应于特定信号 当设置一个位时 这意味着 该位对应的信号为
  • 使用 volatile bool 强制另一个线程等待是否安全? (C++)

    我读到的有关 volatile 的所有内容都说它永远不安全 但我仍然倾向于尝试它 而且我还没有看到这种特定场景被宣布为不安全 我有一个单独的线程来渲染场景 从主模拟线程中提取数据 这没有同步 并且工作正常 问题是 当程序退出时 渲染器需要停
  • “benaphores”值得在现代操作系统上实施吗?

    当我还是一名 BeOS 程序员时 我读过本文 http www haiku os org legacy docs benewsletter Issue1 26 html Engineering1 26作者 Benoit Schillings
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • tar.gz 和 tgz 是同一个东西吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我创建了 tgz 文件tar czvf filecommand then 我最终得到了一个 tgz 文件 我想知道它和tar gz 之间的
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • 无需停止程序即可输入

    我正在尝试制作一个倒计时器来打印剩余时间 当您输入某些内容时 它会打印您输入的内容 我的问题是我不想等待输入 只是继续运行计时器 我的错误代码 timer 100 while True print timer timer 1 if inpu
  • 在ctypes回调函数中使用线程锁

    我想使用扭曲应用程序中的 ctypes dll 这里编造的最小示例 from ctypes import from threading import Lock lock Lock dll windll LoadLibrary mydll d
  • 尝试写一个无锁的单链表,麻烦去除

    我正在尝试编写一个无锁单链表 最终一致性不是问题 有人遍历可能包含不正确项目的列表 我认为我正确添加了项目 循环和Interlocked CompareExchange 但我不知道如何删除节点 列表中的任何位置 因为我必须获取前一个项目并设
  • 在Linux中将日期附加到文件名

    我想在文件名旁边添加日期 somefile txt 例如 somefile 25 11 2009 txt 或 somefile 25Nov2009 txt 或任何类似的内容 也许脚本或终端窗口中的某些命令可以执行 我正在使用Linux Ub
  • 为什么“script”命令会生成 ^[ 和 ^M 字符以及如何使用 vim 搜索和替换删除它们?

    在linux上 使用bash shell 当我使用script命令时 生成的文件称为typescript 当我用 vim 打开该文件时 每一行都包含 M字符 并且有几行 由于我的彩色命令提示符 包含一个字符 我想用任何东西替换这些字符 从而
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变

随机推荐

  • 在 scikit-learn Pipeline 中插入或删除步骤

    是否可以删除或插入步骤sklearn pipeline Pipeline object 我正在尝试在 Pipeline 对象中有或没有一步进行网格搜索 想知道我是否可以在管道中插入或删除一个步骤 我看到在Pipeline源代码 有一个sel
  • 从 eclipse 的内部浏览器打开网站?

    谁能帮助我从 Eclipse 的内部 嵌入式 浏览器中打开网页 我正在与浏览器并行运行 Linux 平铺窗口管理器 和 Eclipse 3 7 2 这很痛苦 我希望它能够轻松地从我的代码中读取需求 同时读取代码 这可能是超级用户的问题 但它
  • mocha done() 和 async wait 的矛盾问题

    我有以下测试用例 it should pass the test async function done await asyncFunction true should eq true done 运行它断言 错误 解决方法指定过多 指定回调
  • 是否可以在 Monotouch 中使用 NSZombieEnabled?

    我一直在阅读有关环境变量的信息NSZombieEnabled http www cocoadev com index pl NSZombieEnabled我想知道目前是否可以在 Monotouch 运行时中使用它 如果没有 是否有合适的替代
  • 以编程方式设置打印机功能

    我正在开发一个 C 桌面应用程序 我需要更改一些打印机设置并打印一些图片 在我的程序中 我已经可以设置纸张尺寸 打印机名称等 如果我进入打印机首选项的高级选项 有一个名为 打印机功能 的部分 我不知道如何访问打印机设置中的参数 例如 有 边
  • sudoers 是世界可写错误[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我更改了 Ubuntu 12 10 上的 ect 文件权限 以便我可以编辑 bash bashrc 以便 Neo4j 可以看到 JVM 但现在当我尝试
  • ORACLE MINUS 关键字的 ANSI SQL 标准

    我有一个查询 我想要与 ANSI SQL 标准兼容 在这个 使用 oracle 查询 MINUS key work 我想要 ANSI SQL 这是 放置于 MINUS 关键字 SELECT F selected UPPER a busine
  • Angular-UI 路由器:嵌套视图不起作用

    构建多步骤表单 向导 原来是在关注本教程 https scotch io tutorials angularjs multi step form using ui router 效果很好 但我现在正在尝试对其进行调整 以便将第一步嵌入到主页
  • Perl 正则表达式在相同情况下替换

    如果您在 perl 中有一个简单的正则表达式替换 如下所示 line s JAM AAA g 我将如何修改它 以便它查看匹配并使替换与匹配的大小写相同 例如 JAM 将变成 AAA jam 会变成 aaa 基于 Unicode 的解决方案
  • Git 子模块初始化异步

    当我跑步时git submodule update init第一次在有很多子模块的项目上 这通常需要很多时间 因为大多数子模块都存储在缓慢的公共服务器上 是否可以异步初始化子模块 从 Git 2 8 开始 你可以这样做 git submod
  • PHP/C++:将值注入 EXE 文件 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想动态地将一个值注入到 EXE 文件中 我过去接触过的一家公司给了我一个 EXE 存根 我可以在用户下载它之前使用 PHP 动态注入
  • Qt 构建可以开箱即用静态链接?

    我使用 Qt 构建了一个小型应用程序 事实证明 我需要从头开始重新配置 Qt 以便能够静态链接 我以前做过 我记得那是一个非常漫长的过程 那么有人知道提供开箱即用静态链接功能的 Qt SDK 安装程序吗 此外马丁 贝克特的回答 https
  • 比较 data.table 的两行并仅显示有差异的列[重复]

    这个问题在这里已经有答案了 我得到了一个大的 data table 其中包含不同类型的列 例如数字或字符 例如 data table name c A A val1 c 1 2 val2 c 3 3 cat c u v name val1
  • 在 Apache POI 3.9 中,使用 autosizeColumn 同一列上的图像会被拉伸

    我在 Excel 工作表中有一张图像和图像下方的一些文本 当我将 autoSizeColumn 应用于文本呈现的列时 图像也会被拉伸 我还将锚类型设置为 2 但这并不能保护图像调整大小 我在这里发布一些示例代码 public static
  • Spark:JavaRDD 到 JavaPairRDD<>

    我有一个JavaRDD
  • 透明精灵表有黑色背景

    我正在使用 Python 和 Pygame 开发游戏 我为其中一个敌人创建了一个精灵表 并使其代码正常工作 问题是图像看起来有黑色背景 即使它是透明图像 它的代码是这样的 enemySheet pygame image load resou
  • 使用 selenium Java (Mac OSX) 将 Firefox 浏览器置于前端

    我正在使用三个火狐驱动程序实例进行自动化 我需要将当前活动的火狐浏览器置于前面 因为我正在使用一些机器人类进行某些操作 我曾在 mac 中尝试过针对 google chrome 的 java 脚本警报 相同的操作 并且工作正常 在 Wind
  • 在Android 4.2 API 17上读取Sqlite Cursor carsh

    我有一张桌子145行 当我尝试获取所有数据时crashed on android 4 2 BUT它工作得很好android 4 4 emulator public ArrayList
  • 为什么我不能得到与 GridSearchCV 相同的结果?

    GridSearchCV只返回每个参数化的分数 我还希望看到 Roc 曲线以更好地理解结果 为了做到这一点 我想采用性能最好的模型GridSearchCV并重现这些相同的结果 但缓存概率 这是我的代码 import numpy as np
  • 超低延迟硬实时多线程 x86 代码的意外周期性行为

    我正在具有 RT 优先级的专用 CPU 上循环运行代码以进行多次迭代 并希望长时间观察其行为 我发现代码有一个非常奇怪的周期性行为 简而言之 这就是代码的作用 Arraythread while 1 if flag Multiply mat