我需要使用 windows hpc sheduler 在现有程序的 48 分布式核心中创建分布式任务。
我如何创建一个任务,允许我在输入中使用变量文件分发一个简单的工作?
例如我想运行:
pgm.exe img1.png >core 1 machine 1
pgm.exe img2.png >core 2 machine 1
pgm.exe img3.png >core 3 machine 1
等等
我不需要(也不想)修改现有的 exe 代码 pgm.exe
谢谢你的回答。
如果您可以通过命令行执行您需要执行的所有任务,您可以编写一个简单的应用程序来通过 HPC 执行此操作。
例如,如果您的命令将在目录 MyPNGFiles 中的所有 PNG 文件上执行,您可以将命令 foreach 到 HPC。我们假设我们已经将文件作为 FileInfo 对象的 List 获取并将其传递给此方法。
我们还假设您有一个 HPCSession 类,该类包装了 MS 公开的 DurableSession 或 Session 对象。此类处理您对 StartInfo 的创建,接受参数以打开与 HPC 的连接,并允许您从中生成调度程序。
IScheduler scheduler = new Scheduler();
scheduler.connect(HPCSession.HeadNode);
ISchedulerJob job = scheduler.CreateJob();
job.Name = "CMDLine HPCJob";
IScheduler task;
int i = 1;
foreach(FileInfo fi in files)
{
task = job.CreateTask();
task.Name = "Task Number " + i.ToString();
task.CommandLine = "pgm.exe " + fi.FullName;
job.AddTask(task);
task.Commit();
job.SubmitTask(task);
task = null;
i++;
}
job.Commit();
//A Job must be in a Configuring state before submission; usually isn't a problem but lets be sure
if (job.State != JobState.Configuring)
scheduler.ConfigureJob(job.JobID);
scheduler.SubmitJob(job, "userName", "password");
请注意,您将希望对所有内容使用完全限定的路径;包括命令行工具。通过命令行任务在 HPC 上执行的 Job 与登录该机器并打开命令提示符并运行命令完全相同;所以在编写命令行命令时必须牢记这一点。
这是一个非常简单的实现;您可以执行其他操作,例如订阅 TaskStateChange 事件以检查集群的运行情况,例如,如果您从一个节点返回 15 个任务全部失败但其他任务没有失败,您可能希望通过打开调度程序并将该节点添加到排除节点列表中。但是在正确执行应用程序之后可能会考虑容错:)。
您还需要确保执行您的作业的 HPC 节点 a) 对文件所在的路径具有读或读/写访问权限;b) 对 exe 具有读/写/执行访问权限(或让 exe 位于 HPC 机器的本地)。