0

我需要使用 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

谢谢你的回答。

4

1 回答 1

0

如果您可以通过命令行执行您需要执行的所有任务,您可以编写一个简单的应用程序来通过 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 机器的本地)。

于 2013-03-08T13:27:37.123 回答