基于时间的演员模型仿真

6
我们有一个单线程应用程序,它使用共享内存模型模拟了数十万个对象之间的交互。显然,它无法在多CPU硬件上进行扩展。
阅读了一些有关基于代理的建模和函数式编程/actor模型的内容后,我考虑使用消息传递范式进行重写。
这个想法非常简单 - 每个对象将作为一个actor,它们的交互将是消息,以便模拟可以并行进行。给定某个时间点上的对象配置 - 可以轻松地计算出其未来的结果。
问题是如何对时间进行建模:
例如,假设X对象的行为取决于A和B,由于演员和消息计算的顺序不保证,可能当要计算X时,A已经向X发送了消息,但是B没有。 如何确保计算正确进行?
希望问题清楚了
提前感谢。
1个回答

10
你使用消息传递来并行化(离散事件?)模拟的方法是众所周知的,不需要特定的函数式风格(当然,这并不妨碍你像那样实现)。
你所描述的关于事件时间的基本问题也被称为“局部因果约束”(例如,参见this textbook)。基本上,你需要使用一个“同步协议”来确保每个对象(或代理)按正确顺序处理其消息。在并行离散事件仿真领域,这些对象被称为“逻辑进程”,它们通过事件(即时间戳的消息)进行通信。
为这些事件正确实现同步协议是具有挑战性的,而选择正确的协议高度取决于应用程序的特定情况。例如,一个重要的因素是每个事件所需的平均计算量:如果所需的计算量很少,则通信成本支配整个执行时间,将难以扩展模拟。
我建议在从头开始之前,先寻找现有解决方案/库来构建您所需的演员框架。请注意不要删除现有解决方案/库这一重点信息。

2
你好,感谢您的回复!
  1. 实际上这是一种离散事件模拟。
  2. 我之所以更喜欢函数式编程风格,是因为我想要拥有副本和不可变数据结构,以避免数据保护的复杂性,而这在函数式编程范式中更自然地实现。
  3. 感谢您推荐给我这本教科书,我一定会看的。您使用确切的术语是一个很好的帮助,因为它可以帮助我在寻找更多信息时优化我的搜索查询。
  4. 当然,我正在考虑现有库的检查,目前我正在评估 akka。
- akiva
2
不客气。您打算使用Scala的Akka吗?如果是这样,您可能需要查看Scalation(https://code.google.com/p/scalation),据我所知,它不支持并行执行,但具有离散事件模拟的不同“世界观”的表示,以及其他一些对您有用的组件。Java框架JAMES II(http://jamesii.org)也提供了许多您需要的组件(例如事件队列),并且具有用于实验规范的Scala接口(http://sessl.org)[免责声明:我是其中之一开发人员]。 - Roland Ewald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接