使用 RDTSC 在 C 中计算 CPU 频率始终返回 0

2023-12-13

我们的讲师向我们提供了以下代码,以便我们可以测量一些算法的性能:

#include <stdio.h>
#include <unistd.h>

static unsigned cyc_hi = 0, cyc_lo = 0;

static void access_counter(unsigned *hi, unsigned *lo) {
    asm("rdtsc; movl %%edx,%0; movl %%eax,%1"
    : "=r" (*hi), "=r" (*lo)
    : /* No input */
    : "%edx", "%eax");
}

void start_counter() {
    access_counter(&cyc_hi, &cyc_lo);
}

double get_counter() {
    unsigned ncyc_hi, ncyc_lo, hi, lo, borrow;
    double result;

    access_counter(&ncyc_hi, &ncyc_lo);

    lo = ncyc_lo - cyc_lo;
    borrow = lo > ncyc_lo;
    hi = ncyc_hi - cyc_hi - borrow;

    result = (double) hi * (1 << 30) * 4 + lo;

    return result;
}

但是,我需要将此代码移植到具有不同 CPU 频率的机器上。为此,我尝试计算运行代码的机器的 CPU 频率,如下所示:

int main(void)
{
    double c1, c2;

    start_counter();

    c1 = get_counter();
    sleep(1);
    c2 = get_counter();

    printf("CPU Frequency: %.1f MHz\n", (c2-c1)/1E6);
    printf("CPU Frequency: %.1f GHz\n", (c2-c1)/1E9);

    return 0;
}

问题是结果总是0,我不明白为什么。我在 VMware 上以访客身份运行 Linux (Arch)。

在朋友的机器(MacBook)上,它在某种程度上可以工作;我的意思是,结果大于 0,但它是可变的,因为 CPU 频率不固定(我们试图修复它,但由于某种原因我们无法做到这一点)。他有另一台运行 Linux (Ubuntu) 作为主机的机器,它也报告 0。这排除了虚拟机上的问题,我一开始认为这是问题。

任何想法为什么会发生这种情况以及如何解决它?


好吧,由于其他答案没有帮助,我将尝试更详细地解释。问题是现代 CPU 可能会乱序执行指令。你的代码一开始是这样的:

rdtsc
push 1
call sleep
rdtsc

现代CPU可以做到not但必须按原始顺序执行指令。不管你原来的命令是什么,CPU(大部分)都可以自由地执行,就像:

rdtsc
rdtsc
push 1
call sleep

在这种情况下,很清楚为什么两者之间存在差异rdtscs 将是(至少非常接近)0。为了防止这种情况,您需要执行一条 CPU 将执行的指令never重新排列以无序执行。最常用的指令是CPUID。我链接的另一个答案应该(如果没记错的话)大致从那里开始,关于使用所需的步骤CPUID正确/有效地完成这项任务。

当然,蒂姆·波斯特可能是对的,而你是also由于虚拟机而出现问题。尽管如此,就目前而言,即使在真实的硬件上,也不能保证您的代码能够正常工作。

编辑:至于为什么代码would工作:嗯,首先,说明这一事实can无序执行并不能保证它们will是。其次,有可能(至少是某些实现)sleep包含防止序列化指令rdtsc避免围绕它重新排列,而其他的则没有(或可能包含它们,但仅在特定(但未指定)的情况下执行它们)。

剩下的行为可能会随着几乎任何重新编译而改变,甚至只是在一次运行和下一次运行之间发生改变。它可以连续数十次产生极其准确的结果,然后由于某些(几乎)完全无法解释的原因而失败(例如,完全在其他过程中发生的事情)。

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

使用 RDTSC 在 C 中计算 CPU 频率始终返回 0 的相关文章

  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 我必须做什么才能使通过 HTTPS 提供的图像等内容缓存在客户端?

    我使用 Tomcat 作为服务器 使用 Internet Explorer 6 作为浏览器 我们应用程序中的网页大约有 75 张图像 我们正在使用 SSL 加载所有内容似乎非常慢 如何配置 Tomcat 以便 IE 缓存图像 如果您通过 h
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • Ansible 抛出“无法更新 apt 缓存:W:无法安全地从此类存储库更新”错误

    我对 Ansible 非常陌生 我正在尝试在 EC2 实例 Ubuntu 18 04 上安装 kubectl 来上课 我已经运行了剧本 一切进展顺利 直到遇到任务 4 然后抛出以下错误 致命 localhost 失败 gt changed
  • 在 URL 和 .htaccess 中使用空格

    我为我的城市编写了一个本地名称 电话 地址搜索引擎 用户必须能够通过访问以下任一 URL 来快速访问结果 search by number http domain com 5554651 search by lastname http do
  • 如何在 Windows Phone 8.1 中缓存页面

    以前在Windows Phone 8 0应用程序中 我们可以通过这种方式更深入地导航到同一页面 NavigationService Navigate new Uri SamePage xaml UriKind Relative 页面会自动缓
  • QuickGraph - 是否有算法可以找到一组顶点的所有父级(直到根顶点)

    在 QuickGraph 中 是否有算法可以查找一组顶点的所有父级 直到根顶点 换句话说 所有顶点的下方某处 在通往叶节点的路上 都有一个或多个顶点输入 因此 如果顶点是节点 并且边是依赖关系 则找到将受到给定节点集影响的所有节点 如果不是
  • 如何使用 Visual Studio 2019 面向 Windows 7?

    我想使用 Visual Studio 2019 来享受最新的 C 新增功能 但针对的是 Windows 7 我使用 VS 2019 向导创建了一个 Windows C 应用程序 在 Windows 10 上运行 A targetver h文
  • URLEncoder.encode() 和空格?

    我的服务器上有一个名为 some image png 名字里有一个空格 当我在浏览器 chrome 中输入 url 时 它会将空格转换为 20 some 20 png 当我从应用程序中使用 URLEncoder encode some im
  • GStreamer 同时录制和查看流

    我手头有一项奇怪的任务 我已经尝试了一切 我想知道你是否能帮忙 我的任务是抓取 RaspPi 发出的流并将其保存到我的电脑上 但是 我需要同时查看和保存它 这可以查看它 gst launch 1 0 udpsrc 端口 5000 应用程序
  • 相关子查询中的 MySQL LIMIT

    我有一个相关子查询 它将返回数量列表 但我需要最高数量 而且只需要最高数量 因此 我尝试引入 order by 和 LIMIT 1 来实现此目的 但 MySQL 抛出一个错误 指出它还不支持子查询中的限制 关于如何解决这个问题有什么想法吗
  • Qt5 | Cmake |对`QPrinter::QPrinter(QPrinter::PrinterMode)的未定义引用

    我正在为 qt 应用程序准备 cmake 构建 我在哪里使用以下结构 libMyApp 它使用 SET QT5 MODULES Widgets PrintSupport Network XmlPatterns FIND PACKAGE Qt
  • 基于索引模式到间接寻址模式的转换(x86 汇编)

    我目前正在努力将示例从复杂的间接寻址模式更改为简单的间接寻址模式片段 但是 我遇到了基于模式的示例 我无法 转换 Code move eax 28 esp 我试过了 addl 28 esp movl eax esp 这会产生分段错误 我不知
  • 如何在Linux服务器上的80端口启动node.js?

    当我尝试在端口 80 上启动节点时 错误告诉我该端口正在使用中 我想那是阿帕奇 接管 端口 80 并在服务器重新启动后保持这种状态的正确方法是什么 Linux xxxx com 2 6 32 5 amd64 1 SMP 6 月 14 日星期
  • R textConnection:“参数‘对象’必须解析为单个字符串”

    我想将字符串列表转换为数据框 但是 我收到此错误 gt read csv textConnection c id name count 6289 aa 16 6269 bb 8 6269 cc 8 6269 dd 8 6610 ee 4 E
  • 防止 jQuery 多重引用

    我正在开发 DNN 模块 并且在某些模块中使用 jQuery 我将 jQuery 引用添加到每个 ascx 文件的顶部 顺便说一句 当用户将多个模块添加到每次添加模块时引用的页面时 这种情况给出一些错误 当我从另一个模块底部的模块中删除引用
  • Outlook 将电子邮件标记为垃圾邮件

    我知道 我听起来像垃圾邮件发送者 但这些电子邮件对于在我们开发的这个网站上注册帐户的人来说是完全合法的电子邮件确认 这些电子邮件都会发送到各个邮件提供商 gmail yahoo aol hotmail live 但它们总是被定向到 Outl
  • 如何使用winsound同时播放多个声音?

    我正在尝试使用内置的winsound 库将多个声音叠加在一起 我开始我的第一个声音 winsound PlaySound test1 wav winsound SND FILENAME winsound SND ASYNC 当我尝试启动其他
  • 动画分割面板分隔线

    我有一个水平分割窗格 我想在单击按钮时更改分隔线位置 以便创建某种 幻灯片 动画 分隔线将从 0 完全向左 开始 单击时它会打开到 0 2 当我再次单击时 它会返回到 0 现在我实现了这一点 我只是使用 spane setdividerPo
  • 限制 = 1 = 1ms,限制 > 1 = 150 ms(芒果融化)

    使用 MongoDB Native Driver 查询如下 mo post find us us utc lte utc fields geo 0 bin 0 flg 0 mod 0 edt 0 hint us 1 utc 1 sort u
  • 如何使用 jQuery 禁止输入或粘贴字符(并替换它们)?

    我正在尝试找到一种方法来替换表单中所有输入字段 本质上是文本框和文本区域 中输入或粘贴的不允许的字符 每当用户粘贴包含一个或多个不允许的字符的文本时 我都希望将该字符替换为空字符串 但保持文本的其余部分完好无损 如果他们不断地输入字符 我只
  • 当折叠可见时,如何通过单击主体隐藏我的折叠 Bootstrap 3 导航栏?

    我正在为我将去工作的机构制作一个 WordPress 网站 我使用 Bootstrap 3 0 并创建了一个响应式菜单 如何在折叠和可见时隐藏菜单 第二张图片 单击主体 并且菜单按钮更改其颜色 只有折叠可见 bootstrap js 和 j
  • 使用 RDTSC 在 C 中计算 CPU 频率始终返回 0

    我们的讲师向我们提供了以下代码 以便我们可以测量一些算法的性能 include