0

我有一个模拟引擎,我想先并行化,然后在 C# 中开发为 Web 服务。这是一个密集的模拟,需要大量的 CPU 和 RAM,我想将每个运行拆分在一个单独的线程上。为了让您更好地了解模拟可以运行 100 次运行,每次运行我都会收集一些结果。收集每次运行的结果然后将它们整理到一个大文件中是很简单的。因此,如果我有一台具有 4 个内核的多核机器,例如,想法是在每个内核上运行 4 次,然后再运行 4 次……等等。我在较新版本的 .net 中阅读了一些关于并行扩展的内容。我可以在 3.5 中实现相同的目标,还是迁移到 4.0 会更好?如果我将其设为 Web 服务,还有什么要注意的吗?任何进一步的想法或建议都非常受欢迎。

4

1 回答 1

1

您最好迁移到 4.0 并使用 TPL。这样,您可以创建一个 Task<> 来运行每个模拟,并让 TPL 调度程序在资源可用时适当地安排它们。运行完成后,您可以将结果放入 ConcurrentCollection<> 中,一旦一切完成,就对它们运行排序规则(如果这对您很重要,您甚至可以在其他任务运行时进行另一个任务排序)。

在 3.5 中,大部分调度工作将留给您,并且 API 不适合创建任务。您也不会拥有任何可能使结果排序更简单的并发集合(永远不要低估编写正确且高性能的并发集合的复杂性)。

如果您将此作为 Web 服务,那么您必须了解该服务的使用以及这将如何影响 Web 服务。从本质上讲,您可以改善单个请求延迟,但这可能会以降低整体吞吐量为代价。有关此问题的讨论,请参见以下链接。

http://blogs.msdn.com/b/pfxteam/archive/2010/02/08/9960003.aspx

于 2011-04-06T22:43:20.177 回答