【问题标题】:Is it possible to sleep for a certain amount of cycles是否可以睡一定数量的周期
【发布时间】:2014-02-22 11:39:24
【问题描述】:

我想知道是否有可能让线程休眠一定数量的 CPU 周期?

我考虑过只插入“nop”,但我不确定它们是否会被优化掉,我希望有一个高级别的解决方案。

有什么好东西可以推荐给我吗?如果不能,我可以防止手动插入的“nop”在不禁用所有优化的情况下得到优化吗? 亲切的问候

卢卡斯·海弗利格

编辑:作为另一个问题:是否可以测量某个代码片段在执行期间所需的周期数?

【问题讨论】:

  • 一些高级编译器允许将程序的某些部分排除在优化之外,甚至在该部分设置一定的优化级别。哎呀,即使是 Delphi 5 也允许它,但我还没有在 VisualStudio 中看到这样的编译器指令。
  • 你看过 System.Threading.Thread.SpinWait 吗?
  • 由于我没有完全绑定到 C#,是否会切换到 c++/c 之类的东西添加此功能?
  • Windows 是一个多线程系统,你永远不会知道在开始和结束之间解析了多少 CPU 周期。 C# 是一种解释型语言,并进行了部分优化,您永远无法知道您的代码将使用多少 CPU 周期。在谈论 c# 时,这个问题真的不相关。
  • Profiler 是您第二个问题的答案...第一部分的目标尚不清楚 - 如果您真的需要浪费精确测量的周期数 - 检查 CPU 手册,找到时序最稳定的指令并使用它们在一个循环中(可能需要针对特定​​的 CPU 系列)。

标签: c# sleep cpu-cycles


【解决方案1】:

简而言之,不,因为周期和指令之间没有 1:1 的映射(实际上,每个周期都会执行许多指令),而且当您有指令流水线、分支预测和推测性等内容时 -执行它显然变得不可预测。

另一个原因是没有基于 CPU 周期(或指令)的中断,而是基于硬件计时器中断或操作系统调度程序在给定当前时间轮询当前线程队列的线程睡眠。

最后,即使在硬件中是可能的,Windows API(.NET 内部使用)除了以毫秒为单位的时间跨度外,不会公开任何其他睡眠参数(无论如何,一毫秒可能是数万个 CPU 周期)。

在 C# 中,这个问题相当荒谬,因为代码将基于当前平台进行 JIT 编译,这意味着您无法预测用于给定代码块的硬件指令,即使这样也有可能您的 CIL 可能由解释器而不是 JIT 执行以减少启动延迟,这会导致 CPU 指令计数消失。

【讨论】:

    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多