Подготовка заданий для выполнения на кластере под управлением Compute Cluster Server
Цель - научиться подготавливать и запускать задания с использованием графического интерфейса менеджера заданий; изучить структуру XML-файлов заданий и их параметры.
Для проведения данного практического занятия понадобится самораспаковывающийся архив ClusterComputing.exe, который либо можно скачать с http://download.microsoft.com/download/f/2/7/f279e71e-efb0-4155-873d-5554a0608523/ClusterComputing.exe, либо он уже может быть доступен на машинах учебного класса, где проводятся занятия. Данный архив необходимо распаковать и открыть соответствующее решение в рамках Visual Studio 2005. В данном решении реализуется несколько алгоритмов перемножения больших матриц.
Для создания матриц, которые будут перемножаться, необходимо выполнить через командную строку команды
MatrixUtil matrix1.mtx 1 5000 MatrixUtil matrix2.mtx 1 5000
после исполнения которых будут созданы матрицы matrix1.mtx и matrix2.mtx размерности 5000 х 5000.
В рамках Windows Compute Cluster Server имеется скрипт job, который можно использовать из командной строки для запуска заданий на кластере.
Для запуска последовательного алгоритма перемножения матриц, необходимо выполнить команду
job submit /f:MatrixMultiplierSerial.x
где XML-файл MatrixMultiplierSerial.xml, описывающий данное задание для вычислительного кластера, имеет вид:
<?xml version="1.0" encoding="utf-8" ?>
<Job xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
SoftwareLicense=""
MaximumNumberOfProcessors="1"
MinimumNumberOfProcessors="1"
Runtime="00:00:50"
IsExclusive="false"
Priority="Normal"
Name="MatrixMultiplierSerial"
Project="Matrix Multiplication"
RunUntilCanceled="false">
<Tasks xmlns="http://www.microsoft.com/ComputeCluster/">
<Task MaximumNumberOfProcessors="1"
MinimumNumberOfProcessors="1"
WorkDirectory="\\DataServer\Public"
Stdout="MatrixMultiplier.out"
Name="MatrixMultliplier"
CommandLine=
"MatrixMultiplier matrix1.mtx matrix2.mtx matrix3.mtx"
IsCheckpointable="false"
IsExclusive="false"
IsRerunnable="false"
Runtime="00:00:50">
<EnvironmentVariables />
</Task>
</Tasks>
</Job>Если команда отсылки задания на кластер закончилась успешно, то этому заданию будет присвоен уникальный ID
Job created , ID: 55
Этот ID в дальнейшем может быть использован для получения информации о состоянии задания, изменения его параметров и снятия его с выполнения.
Например, для получения информации о состоянии задания необходимо выполнить команду
job view 55
По этой команде, будет выдано информационное сообщение примерно такого вида:
JOB_ID: 55 SubmittedBy: TestComputeCluster\Administrator NAME: MatrixMultiplierSerial STATUS: Running CPUS: 1,1 ALLOCATED_NODES: TestNode1 SUBMIT_TIME : 11/22/2005 9:49:00 AM NUM_TASKS: 1 Queued: 0 Running: 1 Finished: 0 Failed: 0 Cancelled: 0
Задание MatrixMultiplierMultiSerial является параллельной реализацией алгоритма перемножения матриц, но без использования MPI.
<?xml version="1.0" encoding="utf-8" ?>
<Job xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
SoftwareLicense=""
MaximumNumberOfProcessors="4"
MinimumNumberOfProcessors="4"
Runtime="00:00:12"
IsExclusive="false"
Priority="Normal"
Name="MatrixMultiplierMultiSerial"
Project="Matrix Multiplication"
RunUntilCanceled="false">
<Tasks xmlns="http://www.microsoft.com/ComputeCluster/">
<Task MaximumNumberOfProcessors="1"
MinimumNumberOfProcessors="1"
WorkDirectory="\\DataServer\Public"
Stdout="MatrixMultiplierMultiSerial.out"
Name="Task1"
CommandLine="MatrixMultiplier.exe matrix1.mtx matrix2.mtx
matrix_out1.mtx 0 0 2500"
IsCheckpointable="false"
IsExclusive="false"
IsRerunnable="false"
Runtime="00:00:10">
<EnvironmentVariables />
</Task>
<!-- Task2, Task3 and Task4 are defined similarly -->
<Task MaximumNumberOfProcessors="1"
MinimumNumberOfProcessors="1"
Depend="Task1,Task2,Task3,Task4"
WorkDirectory="\\DataServer\Public"
Stdout="MatrixMutltiplierMultiSerial.out"
Name="Task5"
CommandLine="MatrixUtil.exe MatrixMerged.mtx 2 matrix_out1.mtx
matrix_out2.mtx matrix_out3.mtx matrix_out4.mtx"
IsCheckpointable="false"
IsExclusive="false"
IsRerunnable="false" Runtime="00:00:01">
<EnvironmentVariables />
</Task>
<Task MaximumNumberOfProcessors="1"
MinimumNumberOfProcessors="1"
Depend="Task5"
WorkDirectory="\\DataServer\Public"
Stdout="MatrixMutltiplierMultiSerial.out"
Name="Cleanup"
CommandLine="del \\DataServer\Public\matrix_out*.mtx"
IsCheckpointable="false"
IsExclusive="false"
IsRerunnable="false"
Runtime="00:00:01">
<EnvironmentVariables />
</Task>
</Tasks>
</Job>
Листинг
1.
В этом алгоритме, каждый процессор вычисляет свою собственную часть результирующей матрицы, получая на вход обе исходных матрицы целиком. Это задание демонстрирует использование нескольких задач и зависимостей между ними.
Запуск данного задания осуществляется командой:
job submit /f:MatrixMultiplierMultiSerial.xml
Описание задания для исполнения MPI-варианта алгоритма перемножения матриц представлено файлом MatrixMultiplierMPI.xml:
<?xml version="1.0" encoding="utf-8" ?>
<Job xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
SoftwareLicense=""
MaximumNumberOfProcessors="4"
MinimumNumberOfProcessors="4"
Runtime="00:00:12"
IsExclusive="false"
Priority="Normal"
Name="MatrixMultiplierMPI"
Project="Matrix Multiplication"
RunUntilCanceled="false">
<Tasks xmlns="http://www.microsoft.com/ComputeCluster/">
<Task MaximumNumberOfProcessors="4"
MinimumNumberOfProcessors="4"
WorkDirectory="\\DataServer\MatrixMultiplier"
Stdout="MatrixMultiplierMPI.out" Name="Task1"
CommandLine="mpiexec.exe -hosts %CCP_NODES%
MatrixMultiplierMPI.exe matrix1.mtx
matrix2.mtx matrix_mpi.mtx"
IsCheckpointable="false"
IsExclusive="false"
IsRerunnable="false"
Runtime="00:00:12">
<EnvironmentVariables />
</Task>
</Tasks>
</Job>Специфика этого задания состоит в использовании только одной задачи, в рамках которой MPI-процессы запускаются командой
mpiexec -hosts %CCP_NODES% MatrixMultiplierMPI.exe
Переменная окружения CCP_NODES задает узлы и процессоры на каждом узле, которые выделены заданию планировщиком. Запуск этого задания на исполнение производится командой
job submit /f:MatrixMultiplierMPI.xml
Задание на исполнение с применением mpiexec можно также послать без использования XML-файла, задавая необходимые параметры в командной строке:
job submit /numprocessors:8 /runtime:5:0 myApplication.exe
Кроме того, Windows Compute Cluster Server предоставляет API (Application Programming Interface) для использования в программах на языке C# с помощью которого можно программно подсоединиться к кластеру, создавать задачи и задания, посылать задания на кластер, управлять заданиями, ресурсами, задачами, узлами и выполнять другие работы. Базовым интерфейсом в этом API является интерфейс ICluster, который предоставляет следующие основные методы:
- Connect
- CreatJob
- CreateTask
- AddTask
- SubmitJob