
- •Основы OpenMp: как распараллелить простой цикл?
- •Основы коммуникаций в mpi: _Comm_rank, _Comm_size, _Send, _Recv.
- •Выравнивание нагрузки (load balancing): как проектировать программы для максимально равномерной загрузки вычислительных ядер/узлов.
- •Синхронизация в OpenMp: поведение по умолчанию, директивы nowait, barrier.
- •Синхронизация типа barrier
- •Описать потенциальные преимущества использования OpenMp task относительно parallel for.
- •Чем полезны директивы atomic в OpenMp и _Reduce в mpi?
- •Разделение данных в OpenMp: поведение по умолчанию, директивы private, firstprivate, lastprivate.
- •Асинхронная передача данных в mpi ( _Isend, _Irecv ), и как она может быть полезна
- •Опишите поведение некоторых базовых коммуникационных утилит в mpi: например _bCast, Scatter, _Gather. Чем они полезны?
Разделение данных в OpenMp: поведение по умолчанию, директивы private, firstprivate, lastprivate.
Если в параллельной области встретился оператор цикла, то, согласно общему правилу, он будет выполнен всеми нитями текущей группы, то есть каждая нить выполнит все итерации данного цикла. Для распределения итераций цикла между различными нитями можно использовать директиву for. #pragma omp for [опция[[,] опция]...]
• private(список)– задаёт список переменных, для которых порожда-ется локальная копия в каждой нити; начальное значение локальных
копий переменных из списка не определено;
• firstprivate(список)– задаёт список переменных, для которых по-рождается локальная копия в каждой нити; локальные копии перемен-ных инициализируются значениями этих переменных в нити-мастере;
• lastprivate(список)– переменным, перечисленным в списке, при-сваивается результат с последнего витка цикла;
Асинхронная передача данных в mpi ( _Isend, _Irecv ), и как она может быть полезна
Процедура MPI_Isend
Формат процедуры:
int MPI_ISend(void *buf, int count, MPI_Datatype datatype, int dest, int msgtag, MPI_Comm comm, MPI_Request *request), где
– buf - адрес начала буфера посылки сообщения;
– count - число передаваемых элементов в сообщении;
– datatype - тип передаваемых элементов;
– dest - номер процесса-получателя;
– msgtag - идентификатор сообщения;
– comm - идентификатор группы;
– OUT request - идентификатор асинхронной передачи.
Процедура осуществляет передачу сообщения, аналогичную MPI_Send, однако возврат из процедуры происходит сразу после инициализации процесса передачи без ожидания обработки всего сообщения, находящегося в буфере buf. Это означает, что нельзя повторно использовать данный буфер для других целей без получения дополнительной информации о завершении данной посылки. Окончание процесса передачи (т.е. того момента, когда можно переиспользовать буфер buf без опасения испортить передаваемое сообщение) можно определить с помощью параметра request и процедур MPI_Wait и MPI_Test.
Сообщение, отправленное любой из процедур MPI_Send и MPI_ISend, может быть принято любой из процедур MPI_Recv и MPI_IRecv.
Процедура MPI_Irecv
Формат процедуры:
int MPI_IRecv(void *buf, int count, MPI_Datatype datatype, int source, int msgtag, MPI_comm comm, MPI_Request *request), где
– OUT buf - адрес начала буфера приема сообщения;
– count - максимальное число элементов в принимаемом сообщении;
– datatype - тип элементов принимаемого сообщения;
– source - номер процесса-отправителя;
– msgtag - идентификатор принимаемого сообщения;
– comm - идентификатор группы;
Данная процедура осуществляет прием сообщения, аналогичный MPI_Recv, однако возврат из процедуры происходит сразу после инициализации процесса приема без ожидания получения сообщения в буфере buf. Окончание процесса приема можно определить с помощью параметра request и процедур MPI_Wait и MPI_Test.
В MPI предусмотрен набор процедур для осуществления асинхронной передачи данных. В отличие от блокирующих процедур, возврат из процедур данной группы происходит сразу после вызова без какой-либо остановки работы процессов. На фоне дальнейшего выполнения программы одновременно происходит и обработка асинхронно запущенной передачи. Данная возможность исключительно полезна для создания эффективных программ. В самом деле, программист знает, что в некоторый момент ему потребуется массив, который вычисляет другой процесс. Он заранее выставляет в программе асинхронный запрос на получение данного массива, а до того момента, когда массив реально потребуется, он может выполнять любую другую полезную работу. Для завершения асинхронного обмена требуется вызов дополнительной процедуры, которая проверяет, завершилась ли операция, или дожидается ее завершения. Только после можно использовать буфер посылки для других целей без опасения запортить отправляемое сообщение.