我目前正在运行一些计算密集型模拟,但它们需要很长时间才能完成。我已经将工作负载分配到处理器中的所有可用物理内核。我想知道的是如何进一步分割工作量并将其分配给其他计算机。我正在考虑购买一些Xeon服务器并将它们用于数字处理。
我遇到的一个大问题是我目前正在Visual Studio中运行该程序( Ctrl F5 ),因为有两种方法我一直在制作小改动。
有关如何/是否可以将工作负载分配给其他计算机的任何建议/如果仍然可以使用VS运行程序,或者每次我想运行它时是否需要创建* .exe?
答案 0 :(得分:1)
这取决于你正在解决的问题。
如果可以轻松并行化,可以使用map / reduce和Hadoop,例如SETI @ Home。
如果不是这样,你可以使用像MPI这样的东西,比如线性代数。
答案 1 :(得分:0)
在这个声明中,问题的关键不在于“我遇到的一个大问题是我目前在Visual Studio中运行程序(Ctrl F5),因为有两种方法可以不断进行小的更改。”?
这是“一个大问题”,因为如果你分发那么你在负责工作时无法修改所有节点上的代码,所以你想一些为你分发它的东西?如果是这种情况,那么我假设您已经知道如何以节点可以占用工作的一小部分的方式拆分算法或数据。
如果是这种情况 - 抱歉,如果我误解了 - 那么将您“不断进行小改动”的部分外部化为一个文件或数据库,以一些简单或更精细的形式编码,具体取决于您要更改的内容,这样您就不会不需要让节点不断变化。在所有节点上部署代码,将它们连接到包含不同位的数据库或文件,享受新的法拉利!
答案 2 :(得分:0)
您可以使用WMI service在远程计算机上启动您的进程。您可以将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
您还可以使用PsExec from SysInternals来处理使其工作的所有细节。
在Visual Studio中构建exe之后,您可以在本地计算机上运行它以确保它能够执行您想要的操作,然后当您准备好在远程系统上启动它时,您可以执行类似于上面的批处理脚本VBS在远程系统上启动exe。
您仍然需要提供一些机制来划分工作负载,以便每个客户端知道它应该处理的问题的哪个部分。您可以在用于启动远程应用程序的命令行中,在具有exe的目录中的配置文件中,在数据库表中提供此信息,或者使用客户端连接回的单独的命令和控制类型服务器(虽然采用这种方法,你很快就会进入你最好学会使用现有解决方案而不是自己动手的阶段。
您可能还想要包含某种远程“kill switch”。您可以使用PsKill from SysInternals,或者如果您想要更优雅的关闭,那么简单的事情就像在exe目录中存在特定文件一样,可以作为远程进程关闭自己的标志。
您还可以考虑向客户端添加CSScript支持,以便远程客户端程序是静态的,并加载并编译CSScript文件以完成工作。如果您在频繁重新部署和重新启动客户端程序时遇到某种困难,或者如果您需要它们略有不同(例如,您可能编写程序为每个客户端生成单独的脚本文件),这可能很有用。/ p>