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

Назначение теста TRANSFER состоит в том, чтобы измерять пиковые характеристики обмена данными между двумя узлами - латентность и пропускную способность.

Понятния пропускной способности и латентности

Предположим, что на двух процессорах (узлах) вычислительной системы работают два процесса, между которыми с помощью сети (другой коммуникационной среды) пересылаются сообщения. В передаче информации, помимо аппаратных устройств, участвует и программное обеспечение, например протокольный стэк (встроенный в ОС) и реализация интерфейса передачи сообщений MPI. Какими характеристиками определяется эффективность передачи информации между процессами параллельного приложения?

Основными характеристиками быстродействия сети являются латентность (latency) и пропускная способность (bandwidth).

Под пропускной способностью R сети будем понимать количество информации, передаваемой между узлами сети в единицу времени (байт в секунду). Очевидно, что реальная пропускная способность снижается программным обеспечением за счет передачи разного рода служебной информации.

Латентностью (задержкой) называется время, затрачиваемое программным обеспечением и устройствами сети на подготовку к передаче информации по данному каналу. Полная латентность складывается из программной и аппаратной составляющих.

Различают следующие виды пропускной способности сети:

  • пропускная способность однонаправленных пересылок ("точка-точка", uni-directional bandwidth), равная максимальной скорости, с которой процесс на одном узле может передавать данные другому процессу на другом узле.
  • пропускная способность двунаправленных пересылок (bi-directional bandwidth), равная максимальной скорости, с которой два процесса могут одновременно обмениваться данными по сети.

В чем измеряются эти величины?

Значения пропускной способности будем выражать в мегабайтах в секунду (MB/sec), значения латентности - в микросекундах (usec = 10-6 sec).

Из чего складывается время на пересылку сообщения?

Время T(L), необходимое на передачу сообщения длины L, можно определить следующим образом: T(L)=s+L/R, где s - латентность, а R - пропускная способность.

Как связаны эффективность пересылок и эффективность параллельных программ?

Для приложений с тонкой параллельной структурой (fine-grained parallelism), какими, как правило, являются вычислительные программы, крайне важны малые величины латентности; тогда как для приложений, использующих большие объемы пересылок (а это, как правило, коммерческие приложения БД), более важно максимальное увеличение пропускной способности.


Методика измерения пропускной способности

Для измерения пропускной способности "точка-точка" используется следующая методика. Процесс с номером 0 посылает процессу с номером 1 сообщение длины L байт. Процесс 1, приняв сообщение от процесса 0, посылает ему ответное сообщение той же длины. Используются блокирующие (blocking) вызовы MPI (MPI_Send, MPI_Recv). Эти действия повторяются N раз с целью минимизировать погрешность за счет усреднения. Процесс 0 измеряет время T, затраченное на все эти обмены. Пропускная способность R определяется по формуле R=2NL/T.

Пропускная способность двунаправленных обменов определяется по той же формуле. В этом случае используются неблокирующие (non-blocking) вызовы MPI (MPI_Isend, MPI_Irecv). При этом производится измерение времени, затраченного процессом 0 на передачу сообщения процессу 1 и прием ответа от него, при условии, что процессы начинают передачу информации одновременно после точки синхронизации.

Методика измерения латентности

Латентность измеряется как время, необходимое на передачу сигнала, или сообщения нулевой длины. При этом, для снижения влияния погрешности и низкого разрешения системного таймера, важно повторить операцию посылки сигнала и получения ответа большое число N раз. Таким образом, если время на N итераций пересылки сообщений нулевой длины туда и обратно составило T сек., то латентность измеряется как s=T/(2N).


Особенности реализации

Тест реализован в виде нескольких файлов на языке Си. Основной модуль (оболочка теста) содержится в файле test_shell.c, необходимые определения и прототипы функций находятся в заголовочном файле transfer.h. а в файлах transf1.c,transf2.c, ... transf5.c содержатся тестовые процедуры с именем transfer_test_operation(), которые соответствуют различным способам организации обменов между двумя процессорами. Например, transf1.c содержит процедуру однонаправленных обменов с помощью блокирующих вызовов MPI_Send/MPI_Recv, transf2.c - процедуру двунаправленных обменов с использованием MPI_Sendrecv, transf3.c - процедуру двунаправленных обменов с использованием неблокирующих вызовов MPI_Isend/MPI_Irecv.

Перед измерением производительности в каждом случае производится однократный запуск тестовой процедуры для проверки корректности пересылок.

Правило для сборки теста с помощью утилиты make описано в файле Makefile. После успешной сборки создаются исполняемые файлы transf1, transf2, ... transf5.

Запуск теста

Исполняемые файлы можно запускать как на 2-х, так и на большем количестве процессоров, в этом случае будет производиться последовательное тестирование производительности обменов между головным и всеми остальными процессорами.

Параметры теста

Объяснение значений параметров теста:

  • np (number of processes) - параметр mpirun, число запускаемых процессов;
  • u (unit) - единицы измерения длины сообщений; возможные значения: b (байты), K (килобайты), M (мегабайты);
  • m (minimum) - начальная (наименьшая) длина сообщения (здесь и далее все размеры указываются в единицах);
  • M (Maximum) - наибольшая длина сообщения;
  • s (step) - шаг увеличения длины сообщения (в случае использования множителя K шаг не используется);
  • K (coeficient) - множитель для увеличения длины сообщения (обычно используются значения 2 или 10);
  • R (repeat) - число глобальных повторов (итераций) всего теста;
  • T (Times) - число итераций в каждой тестовой процедуре;
  • f (fix time) - этот параметр используется для увеличения числа итераций T, если общее время работы всех итераций тестовой процедуры меньше, чем f (задается в тысячных долях микросекунды).
  • H (Head) - указывает номер головного процесса; по умолчанию, головным является нулевой процесс;
  • b (buffer) - размер буфера MPI, дополнительно выделяемого с помощью MPI_Buffer_attach(). В большинстве случаев тест работает без дополнительного буфера.
  • P (Print mode) - режим вывода результатов; значение "time" соответствует выдачи времени (в микросекундах), а значение "rate" (по умолчанию) - скорости (в Мбайт/сек).
  • q (quiet) - флаг отключения дополнительной информации, будут печататься только результаты тестов;
  • o (output) - имя файла, в который будут печататься результаты (по умолчанию, результаты печатаются на терминал).

Пример запуска:

mpirun -np 4 transf2 uK m1 M1024 K2 T10 f100 R2 otransfer.dat

Тест двунаправленных обменов с помощью MPI_Sendrecv будет запущен на 4 процессорах. В данном случае, в качестве единицы длины сообщения выбирается Кбайт (uK), длина сообщений увеличивается в геометрической прогрессии (K2) от 1 Кбайта (m1) до 1 Мбайта (M1024). По умолчанию, каждая тестовая процедура будет повторяться 10 раз (T10), но это количество будет увеличено, если общее время меньше, чем 0.1 сек (f100). Полностью тест будет повторен 2 раза (R2). Результаты будут записываться в файл transfer.dat в текущей директории (otransfer.dat).