Original article can be found here

Методика измерения основных характеристик программно-аппаратной среды

А.Н.Андреев, Вл.В.Воеводин


1.Пропускная способность и латентность


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

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

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

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

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

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

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

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

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

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

Время T(L), необходимое на передачу сообщения длины L, можно определить следующим образом:

T(L)=s+L/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 и прием ответа от него, при условии, что процессы начинают передачу информации одновременно после точки синхронизации.

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

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


2. Тест скорости межпроцессорных обменов


Назначение

Тест позволяет выяснить предельно возможные значения латентности и скорости обмена сообщениями между двумя MPI-процессами при различных способах организации обмена и различных размерах сообщений.

Файлы

test_shell.c - тестовая оболочка 
transf1.c , ... transf5.c - тестовые процедуры для различных тестов - способов 
организации обмена. При компиляции для каждого из тестов создается отдельный 
исполняемый файл. 
Тест 1 - однонаправленные обмены 
Тест 2 - двунаправленные обмены через MPI_Sendrecv 
Тест 3 - двунаправленные обмены через неблокирующие вызовы 
Тест 4 - двунаправленные обмены с использованием ready mode 
Тест 5 - двунаправленные обмены с использованием persistent requests 
Makefile - make-скрипт для компиляции в среде UNIX (MPICH) 

Исполнение

Для исполнения теста нужно запустить его с 2 процессами, например:

	mpirun -np 2 transf1 <параметры теста>

При исполнении теста, в цикле вызывается тестовая процедура с различными значениями параметра "размер сообщения" (msglen). Размер сообщения изменяется либо в арифметической, либо в геометрической прогрессии (см. ключи s и K).

Результаты выдаются в виде двух колонок: размер сообщения в байтах и соответствующее ему значение скорости обменов в MB/sec. Для нулевого размера сообщения выдается значение латентности в микросекундах. Например:

Size	Transfer (MB/sec)

Latency: 250 microseconds
1024	3.906
2048	3.906
3072	5.859

Параметры командной строки

Все параметры имеют вид <буква><значение> и могут идти в командной строке в любом порядке (или вообще отсутствовать). Смысл параметров следующий:

Например:

	mpirun -np 2 transf1 m0 M102400 S1024 otransfer.dat T10
	mpirun -np 2 transf5 m1 M1024 K2 T100

3. Логические топологии


Назначение

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

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

Для каждой топологии рассматриваются однонаправленные и двунаправленные обмены. По каждому логическому каналу между узлами А и В информация в ходе теста передается в обе стороны: от узла А к узлу B и обратно передается по L байт информации. Однако в случае однонаправленных обменов один из узлов, например В, ждет получения сообщения от А, и только тогда может передавать А свое сообщение. Во втором же случае информация может передаваться в обе стороны одновременно.

Конкретные способы организации пересылок средствами MPI (блокирующие, неблокирующие, и т.д. пересылки) здесь не регламентируются; предполагается, что из всех, соответствующих по семантике данной топологии и способу обменов будет выбран вариант с наименьшими накладными расходами.

Методики тестирования будут описаны ниже.

Пропускная способность для случая нескольких узлов

Пусть для данной топологии задействованы N(P) логических каналов, где P - число узлов. Тогда суммарный объем передаваемой по сети информации есть I = 2LN. Пусть узел i имеет Ni(P) логических связей с другими узлами. Тогда этот узел передает и принимает всего 2LNi(P) байт информации.

Нас будет в основном интересовать именно последняя величина, вычисляемая как 2L/T.

Методики тестирования

A. Двунаправленные обмены

Рассмотрим сначала двунаправленные обмены в произвольной логической топологии. Опишем действия каждого из узлов.

Пусть данный узел с номером i имеет Ni(P) соседей. Для "общения" c каждым из них выделяется 2 буфера - один для передачи, другой для приема; каждый из буферов - размером не менее L байт, где L - интересующий нас размер сообщения. Это замечание относится ко всем тестам.

С целью минимизации погрешности эта процедура повторяется несколько раз; величина (t1 - t0), усредненная по всем итерациям, и является интересующим нас временем T. Это замечание также относится ко всем тестам.

B. Однонаправленные обмены

Случай однонаправленных обменов удобно рассмотреть для каждой топологии отдельно.

1) Пусть в логической топологии "Звезда" центральным является узел 0. Действия центрального узла ничем не отличаются от описанных в пункте A. Его соседями являются все остальные узлы.

Каждый из узлов 1,2,...,P-1 использует блокирующую операцию MPI_Recv для приема сообщения от узла 0; а затем посылает узлу 0 свое сообщение с помошью MPI_Send.

2) Топология "Полный граф".

Каждый узел i имеет P-1 соседей: 0,..., i-1, i+1,... P-1.

3) Топология "Кольцо" хороша тем, что независимо от общего количества узлов, каждый узел имеет только двух соседей.

Для узла с номером i это узлы с номерами r = (i+1) (mod P) и l = (i-1)(mod P), называемые соответственно правым и левым соседями для i.

Файлы

nettest.c - тестовая оболочка 
chaos.c - тестовая процедура для топологии "полный граф" 
star.c - тестовая процедура для топологии "звезда" 
ring.c - тестовая процедура для топологии "кольцо" 
istar.c, ichaos.c, iring.c - то же, для двунаправленных пересылок 
env.c - вспомогательные процедуры 
nettest.h, env. h - заголовочные файлы 
Makefile - make-файл для компиляции в среде UNIX (MPICH)

Исполнение

Для исполнения теста нужно запустить его с 3 или более процессами, например:

	mpirun -np 3 nettest 
(для случая обменов между 2 процессами используйте MPI Transfer Test) При исполнении теста, в цикле вызываются тестовые процедуры для всех логических топологий с различными значениями параметра "размер сообщения" (msglen) Размер сообщения изменяется в геометрической прогрессии с показателем 2 (например, 2,4,8,..,1024). Результаты теста выдаются на стандартный вывод в виде таблицы следующего вида:

Size	Star	Chaos	Ring	iStar	iChaos iRing
1024	1.374	0.549	0.776	1.339	0.515	0.750
2048	2.652	1.165	1.623	2.740	1.106	1.611
4096	4.702	2.389	3.240	5.098	2.334	3.339
8192	8.198	4.785	7.101	9.149	4.995	6.865
16384	11.03	7.683	11.50	11.23	8.751	12.555
32768	12.68	9.863	15.69	13.04	11.15	16.985

Параметры командной строки

Все параметры имеют вид <буква><значение> и могут идти в командной строке в любом порядке (или вообще отсутствовать) смысл параметров следующий:

Например:

	mpirun -np 4 nettest m128 M65536 T10
	mpirun -np 6 nettest m1 M1024 T100 

4. Измерение эффективности основных операций MPI


Назначение

Тест позволяет оценить эффективность реализации основных операций интерфейса передачи сообщений MPI.
Условное название		Описание

TIME CALCULATION 		время на один замер времени 
BARRIER 			барьерная синхронизация 
GLOBAL SUM (ALLREDUCE) 		суммирование целочисленных переменных по всем 
				узлам с рассылкой результата по всем узлам 
10 GLOBAL SUMS (ALLREDUCE) 	то же, с 10 переменными 
GLOBAL SUM (REDUCE) 		суммирование целочисленных переменных по всем 
				узлам, результат на одном узле 
10 GLOBAL SUMS (ALLREDUCE) 	то же, с 10 переменными 
BROADCAST 			рассылка целочисленного значения с одного 
				узла по всем узлам 
GATHER 				сбор целочисленных значений со всех узлов на 
				один 
NONBLOCKING SEND & WAIT 	то же, с ожиданием завершения 
IPROBE 				проверка наличия сообщения 
BLOCKING SEND 			блокирующая пересылка 10 целочисленных значений
SENDRECV 			операция посылки и получения 1 целочисленного 
				значения 
SEND & RECV 			посылка, а затем получение одного 
				целочисленного значения 
5 SENDS IN ONE 			одновременная активизация 5 заранее 
				сформированных запросов на передачу 
				целочисленного значения с помощью 
				MPI_Startall и ожидание их завершения 
5 SENDS 			5 неблокирующих пересылок одного целочисленного
				значения, с ожиданием завершения 
SIGNAL SENDING 			посылка сигнала, т.е. сообщения нулевой длины, 
				и получение ответного сигнала (т.е. 
				латентность*2)

Методика тестирования

Время 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;

Все остальные замеры времени осуществляются по следующей схеме:

С целью минимизации погрешности эта процедура повторяется несколько раз. Величина t усредняется по всем итерациям.

Файлы

mpitest.c - исходный текст на языке Си
Makefile - скрипт для компиляции в среде UNIX (MPICH)

Исполнение

Для исполнения теста нужно запустить его с 4 процессами, например:

	mpirun -np 4 mpitest <параметры теста>
Результаты выдаются в виде таблицы следующего вида:

30              Timing
2914            Barrier
2656            Global sum (Allreduce)
2156            10 global sums (Allreduce)
656             Global sum (Reduce)
156             10 Global sums (Reduce)
1066            Broadcast
1266            Gather
70              Non-blocking vector send with wait
370             Blocking vector send
570             SendRecv
870             Send and receive
1480            5 sends in one
1670            5 sends
901             signal sending
(все времена указываются в микросекундах, 10E-6 сек.)

Параметры командной строки все параметры имеют вид <буква><значение> и могут идти в командной строке в любом порядке (или вообще отсутствовать) смысл параметров следующий:

T<число>   - тестовая процедура повторяется указанное число раз (для каждого 
значения msglen), результаты усредняются
t<число>   - число повторений для относительно "быстрых" операций (таких как 
измерение времени)

Например:

	mpirun -np 4 mpitest T10 t100000

5. Тест производительности файловой системы


Назначение

Требуется выяснить скорости файлового ввода/вывода и времена выполнения основных файловых операций для различных размеров файлов.

Параметры командной строки

Все параметры имеют вид <буква><значение> и могут идти в командной строке в любом порядке (или вообще отсутствовать). Смысл параметров следующий:

Результаты

Результаты выдаются в виде таблицы следующего вида

Size,K  Seg,K   Write   Read    OvrWr   Create  Close   Open    Unlink
1       1       0.1     0.6     0.5     0.64    0.84    0.86    3.03
2       2       0.3     1.4     1.2     0.59    0.71    0.67    2.91

Size и Seg - размеры файла и буфера в килобайтах, Write, Read, OvrWr - скорости записи, чтения и повторной записи в MB/sec, Create, Close, Open, Unlink - времена создания, закрытия, открытия, удаления в миллисекундах.

Тестовые процедуры

В этом разделе описаны элементарные тестовые процедуры, используемые методикой тестирования.

A. Тест записи (wtest.c)

В случае, если файл не существовал, он создается, иначе открывается на запись с помощью системного вызова open(). Файл записывается на диск с помощью системного вызова write() в одну или более итераций, блоками по Seg.

B. Тест чтения (rtest.c)

Тестовый файл должен существовать. Файл считывается с диска с помощью системного вызова read() в одну или более итераций блоками по Seg.

С. Тест удаления (utest.c)

Методика тестирования

Для каждого значения размера файла Size число создаваемых файлов размера Size равно N = TestSpace/Size.

В каждом из пунктов результаты усредняются по всем N файлам. Таким образом, вычисляются средние величины скорости записи (Write Rate), чтения (Read Rate), перезаписи ( OverWrite Rate), времена создания (Create), открытия (Open), закрытия (Close), удаления (Unlink).