Caching 仿真中两个核的同步方法

Caching 仿真中两个核的同步方法,caching,multithreading,core,simulator,processor,Caching,Multithreading,Core,Simulator,Processor,我必须用C语言构建一个双核处理器模拟器(实际上是一个多级内存模拟、缓存L1/L2、块替换等)。问题是,我很难找到一种方法来同步内核(我正在以线程的形式编程)。你知道我怎么做全球时钟吗?我应该从线程更改为子进程吗? 提前感谢这里有很多选项:因为您可能最终支持与多个线程的复杂交互,所以您可能需要考虑使用“强”>“虚拟时钟”,消息传递“总线”< /强>。这样,您将有更多的时间关注核心功能,而不是调试同步逻辑 使用这种技术,您可以为每个“参与者”线程(最坏情况)构建一个状态机(请参见),并且不必担心互斥

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

这里有很多选项:因为您可能最终支持与多个线程的复杂交互,所以您可能需要考虑使用“强”>“虚拟时钟”,消息传递“总线”< /强>。这样,您将有更多的时间关注核心功能,而不是调试同步逻辑

使用这种技术,您可以为每个“参与者”线程(最坏情况)构建一个状态机(请参见),并且不必担心互斥体/条件。一旦你有了这个基础,你将能够处理出现在中流的情况(例如,“我忘记了这个细节……不用担心,只要在这里添加一个状态……不必重新洗牌我的互斥锁)


另外,由于进行模拟都是关于“虚拟时间”(因为你不能实时运行!),所以有一个基于“虚拟时钟”的基础架构“将问题抽象到适当的级别。

您可以有一个时钟线程加上N个处理器线程。时钟线程可以显式地调用每个处理器线程以执行一个处理步骤。每个处理器线程从时钟线程获得对
doStep()
的调用;它执行一步,然后将控制返回时钟线程


您还可以随机化调用处理器线程执行步骤的顺序,以便更容易捕获客户端代码中的错误。

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