
- •Основы 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 task относительно parallel for.
Директива task (task ... end task) применяется для выделения отдель-ной независимой задачи.
#pragma omp task [опция[[,] опция]...]
Текущая нить выделяет в качестве задачи ассоциированный с директивой блок операторов. Задача может выполняться немедленно после создания или быть отложенной на неопределённое время и выполняться по частям. Размер таких частей, а также порядок выполнения частей разных отложенных задач определяется реализацией.
Parallel for Если в параллельной области встретился оператор цикла, то, согласно общему правилу, он будет выполнен всеми нитями текущей группы, то есть каждая нить выполнит все итерации данного цикла.
Чем полезны директивы atomic в OpenMp и _Reduce в mpi?
В OMP: Частым случаем использования критических секций на практике является обновление общих переменных. Например, если переменная sum является общей и оператор вида sum=sum+expr находится в параллельной области программы, то при одновременном выполнении данного оператора несколькими нитями можно получить некорректный результат. Чтобы избежать такой ситуации можно воспользоваться механизмом критических секций или специально предусмотренной для таких случаев директивой atomic.
#pragma omp atomic
Данная директива относится к идущему непосредственно за ней оператору присваивания, гарантируя корректную работу с общей переменной, стоящей в его левой части. На время выполнения оператора блокируется доступ к данной переменной всем запущенным в данный момент нитям, кроме нити, выполняющей операцию.
В данном примере производится подсчет общего количества порожденных нитей. Для этого каждая нить увеличивает на единицу значение переменной count. Для того, чтобы предотвратить одновременное изменение несколькими нитями значения переменной, стоящей в левой части оператора присваивания, используется директива atomic.
#include <stdio.h>
#include <omp.h>
int main(int argc, char *argv[])
{
int count = 0;
#pragma omp parallel
{
#pragma omp atomic
count++;
}
printf("Число нитей: %d\n", count);
}
В МPI: Например, пусть в адресном пространстве всех процессов некоторой группы процессов имеются копии переменной var (необязательно имеющие одно и то же значение), тогда применение к ней операции вычисления глобальной суммы или, другими словами, операции редукции SUM возвратит одно значение, которое будет содержать сумму всех локальных значений этой переменной. Использование этих операций является одним из основных средств организации распределенных вычислений.
Операция глобальной редукции, указанная параметром op, выполняется над первыми элементами входного буфера, и результат посылается в первый элемент буфера приема процесса root. Затем то же самое делается для вторых элементов буфера и т.д.
С:
int MPI_Reduce(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype,
MPI_Op op, int root, MPI_Comm comm)
IN |
sendbuf |
- |
адрес начала входного буфера; |
OUT |
recvbuf |
- |
адрес начала буфера результатов (используется только в процессе-получателе root); |
IN |
count |
- |
число элементов во входном буфере; |
IN |
datatype |
- |
тип элементов во входном буфере; |
IN |
op |
- |
операция, по которой выполняется редукция; |
IN |
root |
- |
номер процесса-получателя результата операции; |
IN |
comm |
- |
коммуникатор. |