Подготовка заданий для выполнения на кластере под управлением 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