Назначение теста

Назначением теста 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).