Протестируйте своего кластера в сравнении с эталоном с проблемой HPC

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

Подготовьте проблему HPC

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

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

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

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

Запустите проблему HPC

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

HPL

hpccHPL(m), известный как Сравнительный тест Linpack, измеряет уровень выполнения для решения линейной системы уравнений. Это создает случайный распределенный действительный матричный A из размера m- 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) измеряет уровень выполнения действительного матричного умножения матриц. Это создает случайные распределенные действительные матрицы AB, и C, из размера m- 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- 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, giga обновления в секунду. В этом тесте рабочие используют генератор случайных чисел, скомпилированный в 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.

Fft

hpccFFT(m) измеряет уровень выполнения параллельного расчета быстрого преобразования Фурье (FFT) на распределенном векторе длины 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 вашему кластеру и продолжить работать в MATLAB.

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

delete(gcp);

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

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

  • '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, в области Environment, выбирают 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 физические ядра на машину. Обратите внимание на то, что в этом сравнительном тесте, размер данных увеличивается с количеством рабочих.

Смотрите также

|

Похожие темы