【问题标题】:Way to synchronize two cores in simulation在仿真中同步两个内核的方法
【发布时间】:2009-12-09 13:28:35
【问题描述】:

我必须用 C 语言构建一个双核处理器模拟器(它实际上是一个多级内存模拟、缓存 L1/L2、块替换等)。问题是,我很难找到一种同步内核的方法(我将其编程为线程)。有什么想法可以做一个全球时钟吗?我应该从线程更改为子进程吗? 提前致谢

【问题讨论】:

    标签: caching multithreading core simulator processor


    【解决方案1】:

    这里有很多选择:由于您最终可能支持与多个线程的复杂交互,因此您可能需要考虑使用带有消息传递“总线”的“虚拟时钟”。这样,您将有更多时间专注于核心功能,而不是调试同步逻辑...

    使用这种技术,您可以为每个“参与者”线程(最坏情况)构建一个状态机(参见 here),而不必担心互斥体/条件。一旦你有了这个基础,你就可以处理中途出现的案例(例如“我忘记了这个细节......不用担心,只需在此处添加一个状态......不必重新-shuffle 我的互斥锁)。

    此外,由于模拟完全是关于“虚拟时间”(因为您无法实时运行!),因此拥有基于“虚拟时钟”的基础架构可以将问题抽象到适当的级别。

    【讨论】:

    • 这项任务可能需要一个共享内存模型而不是消息传递模型,因为这就是当今真实机器的构建方式。
    • @Dave:我猜,尝试解决这个问题,同时仍然尊重 CPU 的所有复杂细节。诚然,我在 15 年前就已经构建了这样的模拟器,而且我对这类项目有点生疏,但即使考虑到我 15 年的“新”经验,我仍然会采用我的解决方案。
    • @Dave:最后一件事,你知道仿真工具(来自 Mentor、Synopsys 等公司的工作原理吗?...虚拟时钟...)
    • @thiagobrandam:我的回答满意吗?
    • 首先,感谢 jldupont 和 dave。我们只是放弃了使用线程。相反,我们选择在一个函数中序列化两个处理器,并使用 rand() 来模拟它们竞争 L2 缓存时的竞争条件。两者都返回他们将要忙碌的时间,并且两个 if(在一个循环中)验证他们是否准备好从需要的任何地方获取更多数据(因为这个模拟都是关于获取数据的),而一个全局时钟和一个 16位 LRU 计数器递增。阻止和同步更容易,可能不完全现实,但结果非常接近。
    【解决方案2】:

    你可以有一个时钟线程加上 N 个处理器线程。时钟线程可以显式调用每个处理器线程以进行 1 个处理步骤。每个处理器线程从时钟线程得到一个对doStep()的调用;它迈出一步,然后将控制权返回给时钟线程。

    您还可以随机化调用处理器线程以执行步骤的顺序,这样您就更有可能在客户端代码中发现错误。

    【讨论】:

      猜你喜欢
      • 2012-07-19
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多