Тест эффективности основных операций MPI
Назначение теста
Назначением теста MPITEST является выяснить эффективность реализации и выполнения некоторых базовых конструкций MPI в рамках тестируемого программно-аппаратного комплекса.
Тестируемые конструкции MPI
В начале опишем тестируемые конструкции MPI. Методика тестирования будет описана чуть ниже.
Условное название | Описание |
TIMING | время на один замер времени |
BARRIER | барьерная синхронизация всех процессов |
ALLREDUCE | суммирование N целочисленных переменных по всем узлам с рассылкой результата по всем узлам |
REDUCE | суммирование N целочисленных переменных по всем узлам, результат на одном узле |
BROADCAST | рассылка N целочисленных значений с одного узла по всем узлам |
GATHER | сбор N целочисленных значений со всех процессов на один головной процесс; в результате, головной процесс принимает N*(np-1) целочисленных значений |
ALLGATHER | Каждый процесс посылает всем остальным N целочисленных значений; в результате, каждый процесс посылает N, а принимает N*(np-1) целочисленных значений; эту операцию можно реализовать как GATHER (сбор). а потом BCAST (рассылка). |
ALL-TO-ALL | Каждый процесс посылает каждому по N целочисленных значений; в результате, каждый процесс посылает и принимает по N*(np-1) целочисленных значений |
ISEND & WAIT | Неблокирующая посылка N целочисленных значений от одного процесса другому с ожиданием завершения |
BLOCKING SEND | блокирующая пересылка N целочисленных значений от одного процесса другому целочисленных значений |
SENDRECV | операция посылки и получения N целочисленных значений |
SEND & RECV | посылка, а затем получение N целочисленных значений |
SIGNAL SENDING | посылка сигнала, т.е. сообщения нулевой длины, и получение ответного сигнала (получаемое время должно примерно равняться удвоенной латентности) |
Методика тестирования
Время DT на один замер времени вычисляется так:
t1 = MPI_Wtime();
t2 = MPI_Wtime();
DT = t2 - t1;
Время DB на операцию синхронизации вычисляется так:
MPI_Barrier(comm);
t1 = MPI_Wtime();
MPI_Barrier(comm);
t2 = MPI_Wtime();
DB = t2 - t1 - DT;
Все остальные замеры времени осуществляются по следующей схеме:
- производится синхронизация с помощью MPI_Barrier
- замеряется текущее время t1
- исполняются вызовы MPI, относящиеся к тестируемой конструкции
- снова производится барьерная синхронизация
- замеряется текущее время t2
- время, затраченное на исполнение тестируемой конструкции вычисляется как t = t2 - t1 - DT - DB.
С целью минимизации погрешности эта процедура повторяется несколько раз. Величина t усредняется по всем итерациям.
Особенности реализации
Тест реализован в виде одного файла mpitest.c на языке Си.
Параметры теста
- np (number of processes) - параметр mpirun, число запускаемых процессов;
- m (minimum) и M (Maximum) - наименьшая и наибольшая длина массива данных, с которым будут оперировать тестовые процедуры, задается в целых числах;
- K (coeficient) - множитель для увеличения длины сообщения (обычно используются значения 2 или 10);
- R (repeat) - число глобальных повторов (итераций) всего теста;
- T и t (Times) - число итераций в каждой тестовой процедуре для "продолжительных" и "быстрых" тестовых операций. "Быстрыми" операциями считаются: замер времени, барьер, посылка сигнала (измерение латентности). Очевидно, что для более точного измерения следует увеличить число итераций.
- b (buffer) - размер в байтах буфера, выделяемого для обеспечения пересылок; по умолчанию, размер буфера составляет 16 Мбайт;
- o (output) - имя файла, в который будут печататься результаты (по умолчанию, результаты печатаются на терминал).
Пример запуска:
mpirun -np 4 mpitest m1 M100 K10 T100 t100000 R2 otransfer.dat
В данном случае, mpitest будет запущен на 4 процессорах (-np 4). Тест будет оперировать с массивами данных размером в 1, затем в 10 и 100 целых чисел (m1 M100 K10). Для "продолжительных" операций тестовая процедура будет повторяться 100 раз (T100), для "коротких" - 100 тыс. раз (t100000), с целью более точного измерения. Весь тест целиком будет повторен 2 раза (R2). Результаты будут печататься в файл transfer.dat в текущей директории (otransfer.dat).