- •Оглавление
- •Директивы
- •Примеры
- •Примеры
- •Примеры
- •Примеры
- •Примеры
- •Пример
- •Примеры
- •Примеры
- •Примеры
- •Синхронизация
- •Синхронизация
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пирмер
- •Пример условной компиляции
- •Вопросы
- •Пример условной компиляции
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Конец
Терминология
Особенность MPI:понятиеобластисвязи
(communicationdomains).Призапуске приложениявсепроцессыпомещаютсяв создаваемуюдляприложенияобщую область связи.
Принеобходимости онимогутсоздавать новыеобласти связинабазе существующих.Всеобластисвязиимеют независимуюдруготдруганумерацию процессов.
245
Терминология
Программепользователя враспоряжение предоставляетсякоммуникатор - описатель областисвязи.Многиефункции MPIимеютсредивходныхаргументов коммуникатор, который ограничивает сферуихдействиятой областью связи,к которой онприкреплен.
246
Терминология
Для одной областисвязиможет существовать несколько коммуникаторов такимобразом,чтоприложениебудет работать снейкакснесколькимиразными областями.
247
Терминология
Висходныхтекстах примеровдляMPI частоиспользуетсяидентификатор
MPI_COMM_WORLD. Это название коммуникатора, создаваемого библиотекойавтоматически.Он описываетстартовую область связи, объединяющуювсепроцессыприложения.
248
КомандыMPI
MPI_Init(int *argc, char ***argv)
MPI_Finalize()
MPI_Comm_size(MPI_Comm comm, int
*size)
MPI_Comm_rank(MPI_Comm comm, int *rank)
MPI_Get_processor_name(char *name, int
*resultlen)
249
КомандыMPI
MPI_Send(void* buf, int count,
MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
MPI Recv(void* buf, int count,
MPI_Datatype datatype, int source, int tag,
MPI_Comm comm, MPI_Status *status)
250
КомандыMPI
MPI_Send(void* buf, int count,
MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
MPI Recv(void* buf, int count,
MPI_Datatype datatype, int source, int tag,
MPI_Comm comm, MPI_Status *status)
251
КомандыMPI
Существуетнесколько функций,которые используютсявлюбом,дажесамом коротком приложенииMPI. Занимаются онинестолько собственнопередачей данных,сколько ееобеспечением:
252
КомандыMPI
Инициализациябиблиотеки.Однаиз первыхинструкцийвфункцииmain (главной функцииприложения):
MPI_Init( &argc,&argv);
Онаполучаетадресааргументов, стандартно получаемыхсамойmainот операционнойсистемыихранящих параметрыкомандной строки.
253
КомандыMPI
Вконецкомандной строки программы MPI-загрузчикmpirunдобавляетряд информационныхпараметров,которые требуютсяMPI_Init.Это показываетсяв примере0.
254
КомандыMPI
Аварийноезакрытиебиблиотеки. Вызывается,еслипользовательская программазавершаетсяпопричине ошибоквременивыполнения,связанныхс
MPI:
MPI_Abort(описатель областисвязи,код ошибкиMPI);
255
КомандыMPI
ВызовMPI_Abortизлюбойзадачи принудительнозавершаетработу ВСЕХ задач,подсоединенныхкзаданной области связи.
Еслиуказанописатель MPI_COMM_WORLD, будетзавершеновсе приложение(всеегозадачи)целиком.
256
КомандыMPI
Нормальное закрытиебиблиотеки: MPI_Finalize();
Настоятельно рекомендуетсянезабывать вписыватьэтуинструкциюперед возвращениемизпрограммы,тоесть:
передвызовомстандартной функцииСи exit;
передкаждым послеMPI_Init оператором returnвфункцииmain.
257
КомандыMPI
Двеинформационныхфункции:сообщают размергруппы(то естьобщееколичество задач,подсоединенныхкееобласти связи) ипорядковыйномервызывающейзадачи:
intsize,rank;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank( MPI_COMM_WORLD, &rank);
258
КомандыMPI
*Началоизавершение: * MPI_Init,MPI_Finalize
* Определениеколичествазадачв приложениииисвоегопорядкового номера:
*MPI_Comm_size, MPI_Comm_rank
*/
259
КомандыMPI
#include <mpi.h> #include <stdio.h>
int main( int argc, char **argv )
{
int size, rank, i;
/* Инициализируем библиотеку */
MPI_Init( &argc, &argv );
260
КомандыMPI
/*Узнаемколичествозадачв запущенномприложении*/
MPI_Comm_size( MPI_COMM_WORLD, &size );
/*... исвойсобственныйномер:от0до
(size-1)*/
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
261
КомандыMPI
/*задачасномером0 сообщает пользователюразмергруппы,
*ккоторой прикрепленаобласть связи,
*сописателем(коммуникатором)
MPI_COMM_WORLD,
*т.е.числопроцессоввприложении!!
*/ |
|
if( rank==0 ) |
|
printf("Total processes count = %d\n", |
|
size ); |
262 |
КомандыMPI
/*Каждая задачавыводитпользователю свойномер*/
printf("Hello! My rank in MPI_COMM_WORLD = %d\n", rank );
263
КомандыMPI
/*Точкасинхронизации,затемзадача0 печатает*аргументыкомандной строки.
*Вкомандной строке могутбыть
*параметры,добавляемыезагрузчиком
MPIRUN.
*/
264
КомандыMPI
MPI_Barrier( MPI_COMM_WORLD ); if( rank == 0 )
for( puts("Command line of process 0:"), i=0; i<argc; i++ )
printf( "%d: \"%s\"\n", i, argv[i] );
265
КомандыMPI
/*Всезадачизавершаютвыполнение
*/
MPI_Finalize(); return 0;
}
266
КомандыMPI
Связь"точка-точка".
Это самыйпростой типсвязимежду задачами:однаветвьвызываетфункцию передачиданных,адругаяфункцию приема.
267
КомандыMPI
Задача1передает: int buf[10];
MPI_Send( buf, 5, MPI_INT, 1, 0,
MPI_COMM_WORLD );
Задача2принимает: int buf[10];
MPI_Status status;
MPI_Recv( buf, 10, MPI_INT, 0, 0, MPI_COMM_WORLD, &status );
268
Коллективныефункции
Подтермином"коллективные"вMPI подразумеваютсятригруппыфункций:
функцииколлективного обмена данными;
точкисинхронизации,илибарьеры;
функцииподдержкираспределенных операций.
269
Коллективныефункции
Коллективнаяфункцияоднимиз аргументовполучаетописательобласти связи(коммуникатор). Вызов коллективнойфункцииявляется корректным, только еслипроизведениз всехпроцессов-абонентов соответствующей областисвязи,иименно сэтимкоммуникатором вкачестве аргумента.
270
Коллективныефункции
Хотя для однойобласти связиможет иметьсянесколько коммуникаторов, подставлять ихвместодруг друганельзя. Вэтом изаключаетсяколлективность: либофункциявызываетсявсем коллективом процессов,либоникем; третьегонедано.
271
Коллективныефункции
Еслитребуетсяограничитьобласть действиядляколлективнойфункции только частьюприсоединенныхк коммуникатору задач,илинаоборотрасширитьобласть действия,необходимо создать временнуюгруппу/область связи/коммуникатор набазе существующих.
272
Точкисинхронизации,илибарьеры
Этимзанимаетсявсегооднафункция: intMPI_Barrier(MPI_Comm comm);
MPI_Barrierостанавливаетвыполнение вызвавшейеезадачидотехпор,покане будетвызванаизовсехостальных задач, подсоединенныхкуказываемому коммуникатору.
273
Точкисинхронизации,илибарьеры
Гарантируется,чтоквыполнению следующейзаMPI_Barrierинструкции каждая задачаприступитодновременнос остальными.
274
Точкисинхронизации,или барьеры
Это единственнаявMPIфункция, вызовамикоторой гарантированно синхронизируетсявовременивыполнение различныхветвей!
275
Точкисинхронизации,или барьеры
Некоторыедругиеколлективныефункции взависимостиотреализациимогут обладать, амогутинеобладать свойством одновременновозвращатьуправление всемветвям;нодлянихэтосвойство являетсяпобочныминеобязательнымеслинужнасинхронность, используется только MPI_Barrier.
276
Функцииколлективногообмена данными
Основныеособенности иотличияот коммуникацийтипа"точка-точка":
наприеми/илипередачуработают одновременноВСЕзадачи-абоненты указываемогокоммуникатора;
277
Функцииколлективногообмена данными
Основныеособенности иотличияот коммуникацийтипа"точка-точка":
коллективная функциявыполняет одновременноиприем,ипередачу;она имеетбольшое количествопараметров, частькоторых нужнадля приема,ачасть дляпередачи;вразныхзадачахтаили инаячастьигнорируется;
278
Функцииколлективногообмена данными
Основныеособенности иотличияот коммуникацийтипа"точка-точка":
как правило,значенияВСЕХпараметров (заисключениемадресовбуферов) должныбытьидентичнымивовсех задачах;
".
279
Функцииколлективногообмена данными
Основныеособенности иотличияот коммуникацийтипа"точка-точка":
MPIназначаетидентификатордля сообщенийавтоматически;
280
Функцииколлективногообмена данными
Основныеособенности иотличияот коммуникацийтипа"точка-точка":
крометого, сообщенияпередаютсянепо указываемомукоммуникатору, апо временномукоммуникатору-дупликату;
темсамымпотоки данныхколлективных функцийнадежноизолируютсядруг от другаиотпотоков, созданных функциями"точка-точка".
281
Коммуникаторы,группыи областисвязи
Группаэтонекоемножествоветвей.Одна ветвьможетбытьчленомнескольких групп.Враспоряжениепрограммиста предоставлентипMPI_Group инабор функций,работающихспеременнымии константами этого типа.
282
Коммуникаторы,группыи областисвязи
Согласно концепцииMPI, послесоздания группунельзядополнить илиусечь - можно создать только новуюгруппупод требуемыйнаборветвейнабазе существующей.
283
Коммуникаторы,группыи областисвязи
Областьсвязи("communicationdomain")-
этонечтоабстрактное: враспоряжении программистанеттипаданных, описывающегонепосредственнообласти связи,какнетифункцийпоуправлению ими.Областисвязиавтоматически создаются иуничтожаются вместес коммуникаторами.Абонентамиодной области связиявляютсяВСЕзадачилибо одной,либодвухгрупп.
284
Коммуникаторы,группыи областисвязи
Коммуникатор, илиописатель области связиэтоверхушкатрехслойного пирога(группы,областисвязи,описатели областейсвязи),вкоторый "запечены" задачи:именноскоммуникаторами программистимеетдело,вызывая функциипересылкиданных,атакже подавляющуючастьвспомогательных функций.
285
Коммуникаторы,группыи областисвязи
Однойобластисвязимогут соответствовать несколько коммуникаторов.
Коммуникаторыявляются "несообщающимисясосудами":если данныеотправленычерезодин коммуникатор, ветвь-получательсможет принятьихтолько черезэтот жесамый коммуникатор, ноничерезкакой-либо другой.
286
Умножениематриц
ДаныдвепрямоугольныематрицыAи B размерностиm*nиn*q соответственно (рисунок1),тогда матрицаC (рисунок2)называетсяих произведением,гдекаждыйеё элементвычисляетсявсоответствии с формулой(1).
287
Умножениематриц
Прианализестандартногометодаумножения понятно,чтоалгоритмнаязыке программированиявысокогоуровняможетбыть реализованспомощьютрёхциклов.
Последовательныйалгоритмумноженияматриц for(i=0;i<NUM_ROW_A; i++)//циклпострокам A for(j=0;j<NUM_COL_B;j++)//циклпостолбцамB for(r =0;r <NUM_ROW_B; r++)//цикл построкам B с[i][j] +=(a[i][r] *b[r][j]);
288
Умножениематриц
Третийциклданного алгоритма(по строкам B)вычисляетодинэлемент результирующейматрицы,второй – отдельную строку,апервый– всю матрицу.
Такимобразом,зачислоитераций, равноечислустрокматрицыA, умноженномуначислоэлементов матрицыB получается результирующаяматрица.
289
Умножениематриц
Приразработке параллельного алгоритма длярешенияданнойзадачибыласначала проанализированазависимостькаждой итерациипоследовательного алгоритмаот данных.
Прианализебыловыяснено,что
длявыполненияоднойизитераций третьегоцикла(вычисленияодного элементарезультирующейматрицы)
необходимыодинэлементматрицыA и одинэлементматрицыB.
290
Умножениематриц
Прианализебыловыяснено,что
длявыполненияоднойитерациивторого цикланужнавсяматрицаоднастрока матрицыA иодинстолбецматрицыB.
длявыполненияодной итерации верхнего,основного циклаженужныодна строка матрицыA ивсяматрицаB.Таким образом,параллелизмвозможенпри разделениивсегопроцессапострокам матрицыA,гдекаждому изпотоков выделяетсякакое-то количествострок.
291
Умножениематриц
Приразработкеиспользоваласьконцепция главногопотока,тоестьодинизпотоковотличается отостальныхповыполняемойфункции.
Программасостоитизтрёхосновныхчастей –
впервойчастиглавнымпотокомпередаётсявся информацияосновнымпотокамдлявыполнения,
вовторойпроизводятсявычисления,
втретьейпроизводитсясборвсейинформации обратно.
Впрограммутакжевведенывспомогательные переменныедляизмерениявременивыполнения программы,котороеявляетсяоднимизглавных
показателейвэксперименте.
292
Умножениематриц
Прииспытаниинакомпьютерес двухъядернымпроцессоромбыли проведенызапускидлятрёхпотоков (так кактолько приминимумдвухрабочих можнополучитьускорение),нодляразного размераматриц.Приэтотакжебыло произведеноиспытаниепоследовательной программыдлясравнения.
293
Умножениематриц
294
Умножениематриц
Испытаниянавычислительномкластере былипроведеныкакдляразногоразмера матриц,такидляразногочислапотоков.
295
Умножениематриц
296
Умножениематриц
297
Умножениематриц
Сравнениерезультатов, полученныхна вычислительномкластереикомпьютере сдвухъядернымпроцессоромIntel
298
Умножениематриц
299
Умножениематриц
Использование вычислительногокластера являетсяоченьвыгоднымприумножении матрицбольшого размер,таккак применениекластераприумножении матрицразмером2000*2000 даётускорение примернов5раз.
300
Умножениематриц
Умножение же матриц малого размера (500*500 и меньше) занимает практически одинаковое время при использовании как кластера, так и компьютерас двухъядерным процессором.
301
Умножениематриц
Это обуславливается затратами на накладные расходы (пересылки данных и т. п.), которыепо своему объёму становятся соизмеримыми с вычислениями, и поэтому особенного ускорения не наблюдается.
302
Умножениематриц
Наибольшее быстродействие достигается при решении задачи на вычислительном кластере при использовании 14 (13 рабочих и 1 главного) потоков.
303
Умножениематриц
Также стоит отметить, что при 12 потоках на кластере по сравнению с 9, 10 и 11 наблюдается упадок быстродействия. Это связано, в первуюочередь, с нерегулярностью организации оборудования кластера (кластер состоит из отдельных блейдов по 8 процессоров, соединённых вычислительной сетью).
304
Умножениематриц
Исходя из этого можно говорить о необходимости отдельных экспериментов при решении каких-то конкретных задач, отличающихся от данной.
305
Обе данные технологии применяются на практике – OpenMP для отдельно взятых машин, а MPI для вычислений на кластерах. Существуют также гибридные технологии.
306