我需要使用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
谢谢你的回答。
答案 0 :(得分:0)
如果您可以通过命令行执行您需要执行的所有任务,您可以通过HPC编写一个简单的应用程序。
例如,如果您的命令将在目录MyPNGFiles中的所有PNG文件上执行,您可以将命令转发到HPC。我们假设我们已经将文件作为FileInfo对象列表获取并将其传递给此方法。
我们还假设您有一个包含MS公开的DurableSession或Session对象的HPCSession类。此类处理您创建的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上执行的作业与登录该计算机,打开命令提示符并运行命令完全相同;因此必须记住命令行命令。
这是一个非常简单的实现;您可以执行其他操作,例如订阅TaskStateChange事件以检查群集的工作方式,例如如果从一个节点返回15个任务都失败但其他任务没有失败,您可能希望通过打开调度程序并将该节点添加到排除节点列表来以编程方式删除该节点。但是,在正确执行应用程序之后,可以考虑容错问题:)。
您还需要确保将执行您的作业的HPC节点a)具有对文件路径的读取或读/写访问权限; b)具有对exe的读/写/执行访问权限(或者exe文件是HPC机器的本地访问权限。)