如何以编程方式模拟较低的处理器频率?

时间:2011-05-02 18:03:21

标签: c assembly x86 cpu simulation

我对在2GHz +处理器上以特定频率(如25MHz)运行程序感兴趣。我可以想到做这样的事情的唯一方法是使用微秒精度睡眠函数,但我不确定如何计算线程应该睡多长时间以匹配特定频率。任何提示或其他想法?我在X86 Linux操作系统上用C语言做这个。

6 个答案:

答案 0 :(得分:2)

这里有几个问题。这首先是你想要模拟的东西。现代处理器的时钟频率为2Ghz,但是流水线指令,因此单个指令可能需要10-30个时钟才能完成。通过在线程中进行休眠,您可以打破管道线。第二个是您希望模拟的粒度。你需要有指令级别的时间,我们可以通过在函数之间放置一些空间来伪造它。

我最后的想法是,您可能不想模拟以25Mhz运行的现代处理器,而是嵌入式设备上的某种类型的ARM芯片。如果是这种情况,那么市场上已有大多数这些芯片的模拟器非常好。将代码编译为目标芯片的本机指令,如果可用,则使用已有的模拟器。


修改

因此,我现在理解你想要每秒25M次执行虚拟处理器的指令。我可能尝试的是一种自适应方法。你有很多时间在指令之间“乱七八糟”。从一些间距开始,睡眠可能会在每条指令之间起作用。请注意,在每个虚拟时钟开始时,尽可能精确地保持阵列的滚动平均值,例如最后25,100或1000个周期。如果平均值超过25Mhz,则开始增加更多空间。如果太慢则缩小空间。

正如我原先所说,很难计算指令在现代处理器上花费的时间。第一组指令可能运行得有点太快或太慢,但是这样的技术应该使其保持接近正确的速度,就像在类似的硬件实现上的典型振荡器那样。

答案 1 :(得分:2)

我建议使用事件驱动的架构:在每个STEP(1 / hz)上,触发1个指令操作。

答案 2 :(得分:2)

我只是在突发中运行模拟。例如,您可以运行25万个周期,然后在10毫秒间隔的剩余时间内休眠。您可以调整模拟所看到的时钟视图,使其完全透明,除非它与需要以特定速率接口的某种外部硬件接口(在这种情况下,这将成为一个更加困难的问题)。

答案 3 :(得分:1)

总结上述答案所说的内容,如果您处于用户模式,试图以特定频率模拟虚拟处理器,您应该实施某种手动"调度"通过睡眠调用或更高级的功能和Windows中的光纤等功能处理CPU指令的线程。需要注意的一点是,某些OS睡眠调用在指定的时间内没有睡眠,因此您可能需要添加其他代码来校准计算机与计算机之间的偏差,以便更接近目标频率。通常情况下,您将无法准确地安排虚拟处理器以25 MHz的稳定速度运行(更可能是22-28 MHz)。无论如何,我同意内森和爆发的想法。祝你在使用哪条道路上好运!

答案 4 :(得分:1)

对于虚拟机,一切都是虚拟的,包括时间。例如,在123实际秒内,您可以模拟5432个虚拟秒处理。测量虚拟时间的常用方法是在每次模拟虚拟指令时递增(或添加某些内容)计数器。

每隔一段时间你就会尝试将虚拟时间与实时同步。如果虚拟时间远远超过实时,则插入延迟以让实时赶上。如果虚拟时间落后于实时,那么你需要为减速找到一些借口。根据模拟的架构,您可以做任何事情;但对于某些架构而言,还有电源管理功能,例如热量限制(例如,您可以假装虚拟CPU变热并且运行速度较慢以冷却)。

您可能还希望拥有一个事件队列,其中不同的模拟设备可以说“在某个特定时间会发生某些事件”;因此,如果模拟的CPU处于空闲状态(等待事件发生),您可以跳到下一个事件发生的时间。如果虚拟机运行缓慢,这为虚拟机提供了一种自然的方式。

下一步是确定时间重要的地方,并且只在这些特定地点实时同步虚拟时间。如果仿真机器正在进行大量处理并且没有做外部观察者可见的任何事情,那么外部观察者无法判断虚拟时间是否接近实时。当虚拟机确实做了外部观察者可见的事情(例如发送网络数据包,更新视频/屏幕,发出声音等)时,首先将虚拟时间与实时同步。

除此之外的步骤是使用缓冲来解决模拟器内部发生事件时从外部观察者可见的情况。对于(夸大的)示例,假设模拟机器认为它是早上8:23并且它想要发送网络数据包,但它实际上只是早上8点。简单的解决方案是将仿真延迟23分钟,然后发送数据包。这听起来不错,但是如果(在虚拟机发送数据包之后)模拟器努力跟上实时(由于在真实计算机上运行的其他进程或任何其他原因),模拟器可能会落后并且您可能会遇到问题虚拟时间与实时相同的错觉。或者,您可以假装数据包已发送并将数据包放入缓冲区并继续模拟其他内容,然后稍后发送数据包(当它实际上是现实世界早上8:23时)。在这种情况下,如果(在虚拟机发送数据包之后)模拟器努力跟上实时,你仍然有23分钟的回旋余地。

答案 5 :(得分:0)

请参阅Fracas CPU模拟器以获取此方法。作者在Heteropar研讨会上提出了这一问题,这是EUROPAR 2010的一部分。它们实质上修改了OS调度程序,以允许用户程序仅使用实际CPU频率的一小部分。