6

我家里有很多不用的电脑。什么是我利用它们来并行化我的 C# 程序而几乎没有代码更改的最简单方法?

我正在尝试做的任务涉及遍历大量英语句子,数据集可以很容易地分成更小的块,在不同的机器上同时处理。

4

9 回答 9

7

... 很少或没有代码更改?

难的。基本上,将 WCF 视为通过网络在程序的各种实例之间进行通信的一种方式。根据算法,结构可能必须彻底改变,或者根本不改变。在任何情况下,您都必须找到一种方法将问题分成彼此独立的部分。然后,您必须设计一种在不同实例之间分配这些部分并收集结果数据的方法。

PLinq提供了一种无需大更改即可并行化程序的好方法,但这仅适用于跨不同线程的一个进程,并且仅适用于算法适合并行化的情况。一般来说,一些手动重构必要的。

于 2008-11-08T19:23:05.600 回答
2

那可能是不可能的。

如何并行化一个程序完全取决于你的程序做什么以及它是如何编写的,并且通常需要大量的代码更改并增加你的程序的许多倍的复杂性。

在程序中轻松提高并发性的常用方法是执行一个重复多次的任务,然后编写一个函数,将该任务分成块并将它们发送到不同的核心进行处理。

于 2008-11-08T19:21:15.183 回答
2

答案取决于您的应用程序将要执行的工作的性质。不同类型的工作有不同的可能并行化解决方案。对于某些类型,没有可能/可行的并行化方式。

我能想到的最简单的场景是一个应用程序,它的工作很容易被分解成离散的工作块。如果是这种情况,那么您只需将应用程序设计为在单个作业块上工作。使您的应用程序能够接受新工作并交付已完成的工作。然后,在其之上构建一个作业调度程序。此调度程序可以是同一应用程序的一部分(将一台机器配置为调度程序,其余机器作为客户端),也可以是一个单独的应用程序。

还有其他需要考虑的事情:机器之间的通信(文件?网络连接?)将如何发生;应用程序需要能够报告/被查询完成的工作百分比?是否需要能够强制应用程序停止处理当前作业?ETC。)。

如果您需要更详细的答案,请编辑您的问题并包括有关应用程序的详细信息、应用程序解决的问题、预期的工作数量等。然后,社区将提供更具体的答案。

于 2008-11-08T19:28:47.803 回答
2

Dryad(Microsoft 的 MapReduce 变体)正好解决了这个问题(在多台 PC 上并行化 .net 程序)。目前处于研究阶段。太糟糕了,还没有 CTP :-(

于 2008-12-08T14:17:08.103 回答
1

您需要在分布式系统上运行您的应用程序,google 用于分布式计算窗口或网格计算 c#。

于 2008-11-08T19:28:11.130 回答
1

每个句子是独立处理的,还是以某种方式组合在一起?如果您的处理一次只处理一个句子,则根本不需要更改代码。只需在您的每台机器上执行相同的代码,然后在它们之间划分数据(您的句子列表)。您可以通过在每台机器上安装一部分数据,或者通过共享数据库并为每台机器分配不同的块来实现这一点。

如果您稍微更改代码以促进并行性,请共享整个数据库并在处理每个句子时让代码“标记”,然后寻找下一个未标记的句子进行处理。这将为您简要介绍线程安全的概念——确保一个处理器不会对另一个处理器产生不利影响的技术。

与往常一样,您可以提供的有关特定应用程序的详细信息越多,SO 社区就越能根据您的目的定制我们的答案。

祝你好运——这听起来像是一个有趣的项目!

于 2008-11-08T19:48:37.890 回答
0

有几种软件解决方案允许您使用基于商品的硬件。一是Appistry。我在 Appistry 工作,我们已经完成了许多解决方案来在数百台机器上运行 C# 应用程序。

一些有用的链接: http: //www.appistry.com/resource-library/index.html

您可以在这里免费下载该产品:http: //www.appistry.com/developers/

希望这会有所帮助-布雷特

于 2008-12-10T21:06:16.200 回答
0

您可能想查看基于流的编程- 它具有 Java 和 C# 实现。解决这个问题的大多数方法都涉及尝试采用传统的单线程程序并找出哪些部分可以并行运行。FBP 采用了不同的方法:应用程序从一开始就设计为多个异步运行的“黑盒”组件(想想制造装配线)。由于传统的单线程程序就像 FBP 环境中的单个组件一样,因此很容易扩展现有的应用程序。事实上,现有应用程序的各个部分通常可以拆分并变成单独的组件,只要它们可以与应用程序的其余部分异步运行(即不是子例程)。有人称之为“把冰山变成冰块”)。

于 2009-02-22T13:29:36.927 回答
0

在我投资并行化您的程序之前,为什么不尝试将数据集分解为多个部分并在每台计算机上手动运行您的程序并手动整理输出。如果可行,请尝试使用脚本将其自动化并编写程序来整理输出。

于 2008-11-08T20:51:21.210 回答