Опубликован: 22.04.2008 | Доступ: свободный | Студентов: 526 / 50 | Оценка: 4.50 / 4.75 | Длительность: 06:55:00
Специальности: Программист
Дополнительный материал 3:

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