1

我目前正在运行一些计算密集型模拟,但它们需要很长时间才能完成。我已经在我的处理器中所有可用的物理内核上分配了工作负载。我想知道的是如何进一步拆分工作负载并将其分配给其他计算机。我正在考虑购买几台 Xeon 服务器并将它们用于数字运算。

我遇到的一个大问题是我目前正在 Visual Studio ( Ctrl F5) 中运行该程序,因为有两种方法我会不断地对其进行小改动。

关于如何/是否可以将工作负载分配给其他计算机/是否仍然可以使用 VS 运行程序的任何建议,或者每次我想运行它时是否需要创建一个 *.exe?

4

3 回答 3

1

这取决于您要解决的问题。

如果它易于并行化,您可以使用 map/reduce 和 Hadoop,例如 SETI@Home。

如果不是,你可以使用像 MPI 这样的东西,比如线性代数。

于 2013-05-01T14:26:24.930 回答
0

您可以使用WMI 服务在远程计算机上启动您的进程。您可以将您的 exe 构建到远程计算机可见的共享目录中,然后在远程计算机上使用 WMI 来启动该 exe。

有很多例子可以做到这一点,但为了说明,假设没有验证复杂性的简单方法是使用 .VBS 脚本文件:

strComputer = "acomputer"
strCommandLine = "calc.exe"

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objProcess = objWMIService.Get("Win32_Process")

intReturnValue = objProcess.Create(strCommandLine, , , intPID)
WScript.Echo "Process ID: " & intPID

您还可以使用SysInternals 的 PsExec来处理完成这项工作的所有细节。

在 Visual Studio 中构建 exe 后,您可以在本地计算机上运行它以确保它执行您想要的操作,然后当您准备在远程系统上启动它时,您可以执行类似于上述 VBS 的批处理脚本来启动远程系统上的 exe。

您仍然需要提供一些机制来划分工作量,以便每个客户端都知道它应该处理的问题的哪一部分。您可以在用于启动远程应用程序的命令行中、在带有 exe 的目录中的配置文件中、在数据库表中提供此信息,或者使用客户端连接回的单独的命令和控制类型服务器(尽管通过这种方法,您很快就会进入学习使用现有解决方案而不是自己动手的阶段)。

您可能还想包含某种远程“终止开关”。您可以使用来自 SysInternals 的 PsKill,或者如果您想要更优雅的关闭,例如在与 exe 相同的目录中存在特定文件这样简单的操作可以作为远程进程自行关闭的标志。

您还可以考虑向客户端添加CSScript支持,以便远程客户端程序是静态的,并加载和编译一个 CSScript 文件来完成这项工作。如果您在频繁重新部署和重新启动客户端程序时遇到某种困难,或者如果您需要它们都略有不同(例如,您可能编写一个程序为每个客户端生成单独的脚本文件),这可能会很有用。

于 2013-05-01T16:57:39.173 回答
0

您的问题的症结不是在此陈述中吗?“我遇到的一个大问题是我目前在 Visual Studio (Ctrl F5) 中运行该程序,因为有两种方法我不断地对其进行小改动。”?

这是“一个大问题”吗,因为如果您分发,那么您在执行工作时无法修改所有节点上的代码,所以您考虑为您分发它?如果是这种情况,那么我假设您已经知道如何以节点可以承担一小部分工作的方式拆分算法或数据。

如果是这种情况 - 对不起,如果我误解了 - 然后将您“不断进行小改动”的部分外部化到文件或数据库中,以某种简单或更复杂的形式编码,具体取决于您正在更改的内容,因此您不需要让您的节点不断变化。在所有节点上部署代码,将它们连接到包含不同位的数据库或文件,享受您的新法拉利!

于 2013-05-01T14:31:50.673 回答