Предположим, что на двух процессорах (узлах) вычислительной системы работают два процесса, между которыми с помощью сети (другой коммуникационной среды) пересылаются сообщения. В передаче информации, помимо аппаратных устройств, участвует и программное обеспечение, например протокольный стэк (встроенный в ОС) и реализация интерфейса передачи сообщений 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 и прием ответа от него, при условии, что процессы начинают передачу информации одновременно после точки синхронизации.
Латентность измеряется как время, необходимое на передачу сигнала, или сообщения нулевой длины. При этом, для снижения влияния погрешности и низкого разрешения системного таймера, важно повторить операцию посылки сигнала и получения ответа большое число раз.
Тест позволяет выяснить предельно возможные значения латентности и скорости обмена сообщениями между двумя 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
Под логическим каналом будем подразумевать неупорядоченную пару узлов (А,B), которые в данной топологии могут обмениваться сообщениями. Логическая топология полностью определяется множеством задействованных логических каналов.
Для каждой топологии рассматриваются однонаправленные и двунаправленные обмены. По каждому логическому каналу между узлами А и В информация в ходе теста передается в обе стороны: от узла А к узлу B и обратно передается по L байт информации. Однако в случае однонаправленных обменов один из узлов, например В, ждет получения сообщения от А, и только тогда может передавать А свое сообщение. Во втором же случае информация может передаваться в обе стороны одновременно.
Конкретные способы организации пересылок средствами MPI (блокирующие, неблокирующие, и т.д. пересылки) здесь не регламентируются; предполагается, что из всех, соответствующих по семантике данной топологии и способу обменов будет выбран вариант с наименьшими накладными расходами.
Методики тестирования будут описаны ниже.
Пусть для данной топологии задействованы N(P) логических каналов, где P - число узлов. Тогда суммарный объем передаваемой по сети информации есть I = 2LN. Пусть узел i имеет Ni(P) логических связей с другими узлами. Тогда этот узел передает и принимает всего 2LNi(P) байт информации.
Нас будет в основном интересовать именно последняя величина, вычисляемая как 2L/T.
Рассмотрим сначала двунаправленные обмены в произвольной логической топологии. Опишем действия каждого из узлов.
Пусть данный узел с номером i имеет Ni(P) соседей. Для "общения" c каждым из них выделяется 2 буфера - один для передачи, другой для приема; каждый из буферов - размером не менее L байт, где L - интересующий нас размер сообщения. Это замечание относится ко всем тестам.
С целью минимизации погрешности эта процедура повторяется несколько раз; величина (t1 - t0), усредненная по всем итерациям, и является интересующим нас временем T. Это замечание также относится ко всем тестам.
Случай однонаправленных обменов удобно рассмотреть для каждой топологии отдельно.
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
Условное название Описание 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
Требуется выяснить скорости файлового ввода/вывода и времена выполнения основных файловых операций для различных размеров файлов.
Все параметры имеют вид <буква><значение> и могут идти в командной строке в любом порядке (или вообще отсутствовать). Смысл параметров следующий:
Результаты выдаются в виде таблицы следующего вида
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 - времена создания, закрытия, открытия, удаления в миллисекундах.
В случае, если файл не существовал, он создается, иначе открывается на запись с помощью системного вызова open(). Файл записывается на диск с помощью системного вызова write() в одну или более итераций, блоками по Seg.
Для каждого значения размера файла Size число создаваемых файлов размера Size равно N = TestSpace/Size.
В каждом из пунктов результаты усредняются по всем N файлам. Таким образом, вычисляются средние величины скорости записи (Write Rate), чтения (Read Rate), перезаписи ( OverWrite Rate), времена создания (Create), открытия (Open), закрытия (Close), удаления (Unlink).