В этом примере показано, как оценить эффективность вычислительного кластера с помощью HPC Challenge Benchmark. Бенчмарк состоит из нескольких тестов, которые измеряют различные шаблоны доступа к памяти. Для получения дополнительной информации см. HPC Challenge Benchmark.
Запустите параллельный пул рабочих мест в кластере с помощью 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 Challenge состоит из нескольких частей, каждая из которых исследует эффективность различных аспектов системы. В следующем коде каждая функция запускает один бенчмарк и возвращает таблицу строк, которая содержит результаты эффективности. Эти функции тестируют различные операции на распределенных массивах. MATLAB распределяет массивы между несколькими параллельными рабочими, поэтому они могут использовать объединенные ресурсы памяти и вычислительные ресурсы вашего кластера. Дополнительные сведения о распределенных массивах см. в разделе Распределенные массивы.
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.
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.
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.
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
физические ядра на машину. Обратите внимание, что в этом бенчмарке размер данных увеличивается с количеством работников.