В этом примере показано, как оценить производительность вычислить кластера со Сравнительным тестом проблемы 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 состоит из нескольких частей, каждая из которых исследует производительность различных аспектов системы. В следующем коде каждая функция запускает один сравнительный тест и возвращает таблицу строки, которая содержит результаты производительности. Эти функции тестируют множество операций на распределенных массивах. Разделы MATLAB распределили массивы на нескольких параллельных рабочих, таким образом, они могут использовать объединенную память и вычислительные ресурсы вашего кластера. Для получения дополнительной информации о распределенных массивах смотрите Распределенные Массивы.
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.
hpccDGEMM(m)
измеряет уровень выполнения действительного матричного умножения матриц. Это создает случайные распределенные действительные матрицы A
B
, и 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.
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.
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.
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
физические ядра на машину. Обратите внимание на то, что в этом сравнительном тесте, размер данных увеличивается с количеством рабочих.