Оцените свой кластер с помощью HPC Challenge

В этом примере показано, как оценить эффективность вычислительного кластера с помощью HPC Challenge Benchmark. Бенчмарк состоит из нескольких тестов, которые измеряют различные шаблоны доступа к памяти. Для получения дополнительной информации см. HPC Challenge Benchmark.

Подготовка HPC Challenge

Запустите параллельный пул рабочих мест в кластере с помощью parpool функция. По умолчанию parpool создает параллельный пул с использованием профиля кластера по умолчанию. Проверьте профиль кластера по умолчанию на вкладке «Вкладке Home» в Parallel > Select a Default Cluster. В этом тесте рабочие общаются друг с другом. Чтобы гарантировать оптимизацию межсетевого общения, установите 'SpmdEnabled' на true.

pool = parpool('SpmdEnabled',true);
Starting parallel pool (parpool) using the 'MyCluster' profile ...
connected to 64 workers.

Используйте hpccDataSizes функция для вычисления размера задачи для каждого отдельного бенчмарка, который удовлетворяет требованиям HPC Challenge. Этот размер зависит от количества рабочих процессов и объема памяти, доступной каждому рабочему. Для примера разрешите использование по 1 ГБ на каждого работника.

gbPerWorker = 1;
dataSizes = hpccDataSizes(pool.NumWorkers,gbPerWorker);

Запуск вызова HPC

Бенчмарк HPC Challenge состоит из нескольких частей, каждая из которых исследует эффективность различных аспектов системы. В следующем коде каждая функция запускает один бенчмарк и возвращает таблицу строк, которая содержит результаты эффективности. Эти функции тестируют различные операции на распределенных массивах. MATLAB распределяет массивы между несколькими параллельными рабочими, поэтому они могут использовать объединенные ресурсы памяти и вычислительные ресурсы вашего кластера. Дополнительные сведения о распределенных массивах см. в разделе Распределенные массивы.

HPL

hpccHPL(m), известный как Linpack Benchmark, измеряет скорость выполнения для решения линейной системы уравнений. Он создает случайную распределенную действительную матрицу A размера m-by- m и действительный случайный распределенный вектор b длины m, и измеряет время, чтобы решить систему x = A\b параллельно. Эффективность возвращается в гигафлопсах (миллиарды операций с плавающей точкой в секунду).

hplResult = hpccHPL(dataSizes.HPL);
Starting HPCC benchmark: HPL with data size: 27.8255 GB. Running on a pool of 64 workers
Analyzing and transferring files to the workers ...done.
Finished HPCC benchmark: HPL in 196.816 seconds.

DGEMM

hpccDGEMM(m) измеряет скорость выполнения умножения действительная матрица-матрица. Он создает случайные распределенные действительные матрицы A, B, и C, размера m-by- m, и измеряет время для выполнения матричного умножения C = beta*C + alpha*A*B параллельно, где alpha и beta являются случайными скалярами. Эффективность возвращается в гигафлопсах.

dgemmResult = hpccDGEMM(dataSizes.DGEMM);
Starting HPCC benchmark: DGEMM with data size: 9.27515 GB. Running on a pool of 64 workers
Analyzing and transferring files to the workers ...done.
Finished HPCC benchmark: DGEMM in 69.3654 seconds.

ПОТОК

hpccSTREAM(m) оценивает пропускную способность памяти кластера. Он создает случайные распределенные векторы b и c длины mи случайный скаляр k, и вычисляет a = b + c*k. Этот бенчмарк не использует межработническую коммуникацию. Эффективность возвращается в гигабайтах в секунду.

streamResult = hpccSTREAM(dataSizes.STREAM);
Starting HPCC benchmark: STREAM with data size: 10.6667 GB. Running on a pool of 64 workers
Analyzing and transferring files to the workers ...done.
Finished HPCC benchmark: STREAM in 0.0796962 seconds.

PTRANS

hpccPTRANS(m) измеряет скорость межпроцессной связи системы. Он создает две случайные распределенные матрицы A и B размера m-by- m, и вычисляет A' + B. Результат возвращается в гигабайтах в секунду.

ptransResult = hpccPTRANS(dataSizes.PTRANS);
Starting HPCC benchmark: PTRANS with data size: 9.27515 GB. Running on a pool of 64 workers
Analyzing and transferring files to the workers ...done.
Finished HPCC benchmark: PTRANS in 6.43994 seconds.

RandomAccess

hpccRandomAccess(m) измеряет количество расположений памяти в распределенном векторе, которое может быть случайным образом обновлено в секунду. Результат повторяется в GUPS, обновляется гига в секунду. В этом тесте рабочие используют генератор случайных чисел, скомпилированный в MEX-функцию. Присоедините версию этой MEX-функции для каждой архитектуры операционной системы к параллельному пулу, чтобы работники могли получить доступ к той, которая соответствует их операционной системе.

addAttachedFiles(pool,{'hpccRandomNumberGeneratorKernel.mexa64','hpccRandomNumberGeneratorKernel.mexw64','hpccRandomNumberGeneratorKernel.mexmaci64'});
randomAccessResult = hpccRandomAccess(dataSizes.RandomAccess);
Starting HPCC benchmark: RandomAccess with data size: 16 GB. Running on a pool of 64 workers
Analyzing and transferring files to the workers ...done.
Finished HPCC benchmark: RandomAccess in 208.103 seconds.

БПФ

hpccFFT(m) измеряет скорость выполнения параллельного быстрого преобразования Фурье (БПФ), расчет на распределенном векторе длины m. Этот тест измеряет как арифметическую способность системы, так и эффективность связи. Эффективность возвращается в гигафлопсах.

fftResult = hpccFFT(dataSizes.FFT);
Starting HPCC benchmark: FFT with data size: 8 GB. Running on a pool of 64 workers
Analyzing and transferring files to the workers ...done.
Finished HPCC benchmark: FFT in 11.772 seconds.

Отображение результатов

Каждый бенчмарк приводит к одной строке таблицы со статистикой. Объедините эти строки, чтобы предоставить сводные данные результатов тестирования.

allResults = [hplResult; dgemmResult; streamResult; ...
              ptransResult; randomAccessResult; fftResult];
disp(allResults);
      Benchmark       DataSizeGB      Time      Performance    PerformanceUnits
    ______________    __________    ________    ___________    ________________

    "HPL"               27.826        196.82       773.11         "GFlops"     
    "DGEMM"             9.2752        69.365       1266.4         "GFlops"     
    "STREAM"            10.667      0.079696       431.13         "GBperSec"   
    "PTRANS"            9.2752        6.4399       1.5465         "GBperSec"   
    "RandomAccess"          16         208.1     0.010319         "GUPS"       
    "FFT"                    8        11.772       6.6129         "GFlops"     

Разгрузка расчетов с batch

Можно использовать batch функция для выгрузки расчетов в HPC Challenge в ваш кластер и продолжения работы в MATLAB.

Перед использованием batchудалите текущий параллельный пул. Пакетное задание не может быть обработано, если в параллельном пуле уже используются все доступные работники.

delete(gcp);

Отправьте функцию hpccBenchmark как пакетное задание для кластера при помощи batch. Эта функция вызывает тесты в HPC Challenge и возвращает результаты в таблице. Когда вы используете batchРабочий процесс принимает роль клиента MATLAB и выполняет функцию. В сложение задайте следующие аргументы пары "имя-значение":

  • 'Pool': Создает параллельный пул с рабочими для работы. В этом случае задайте 32 рабочие. hpccBenchmark управляет HPC Challenge на этих рабочих.

  • 'AttachedFiles': Передает файлы работникам пула. В этом случае приложите версию hpccRandomNumberGeneratorKernel для каждой архитектуры операционной системы. Рабочие получают доступ к тому, который соответствует их операционной системе, когда они выполняют hpccRandomAccess тест.

  • 'CurrentFolder': Устанавливает рабочую директорию работников. Если этот аргумент не задан, MATLAB меняет текущую директорию рабочих процессов на текущую директорию в клиенте MATLAB. Установите значение '.' если необходимо использовать текущую папку рабочих процессов. Это полезно, когда работники имеют другую файловую систему.

gbPerWorker = 1;
job = batch(@hpccBenchmark,1,{gbPerWorker}, ...
    'Pool',32, ...
    'AttachedFiles',{'hpccRandomNumberGeneratorKernel.mexa64','hpccRandomNumberGeneratorKernel.mexw64','hpccRandomNumberGeneratorKernel.mexmaci64'}, ...
    'CurrentFolder','.');

После отправки задания можно продолжить работу в MATLAB. Проверить состояние задания можно с помощью монитора заданий. На Вкладку Home в области Окружения выберите Parallel > Monitor Jobs.

В этом случае дождитесь завершения задания. Чтобы вернуть результаты из кластера, используйте fetchOutputs функция.

wait(job);
results = fetchOutputs(job);
disp(results{1})
      Benchmark       DataSizeGB      Time      Performance    PerformanceUnits
    ______________    __________    ________    ___________    ________________

    "HPL"               13.913        113.34        474.69        "GFlops"     
    "DGEMM"             4.6376        41.915        740.99        "GFlops"     
    "STREAM"            5.3333      0.074617        230.24        "GBperSec"   
    "PTRANS"            4.6376        3.7058        1.3437        "GBperSec"   
    "RandomAccess"           8        189.05     0.0056796        "GUPS"       
    "FFT"                    4        7.6457        4.9153        "GFlops"     

Когда вы используете большие кластеры, вы увеличиваете доступные вычислительные ресурсы. Если время, затраченное на расчеты, перевешивает время, затрачиваемое на межработническое общение, то ваша проблема может хорошо масштабироваться. Следующий рисунок показывает масштабирование бенчмарка HPL с количеством работников в кластере с 4 машины и 18 физические ядра на машину. Обратите внимание, что в этом бенчмарке размер данных увеличивается с количеством работников.

См. также

|

Похожие темы