- •Содержание курса
- •Общие сведения.
- •Топологии Виды топологий
- •Программирование «Трубы»
- •Программирование «Звезды»
- •Программирование «Клика»
- •Синхронный обмен данными
- •Функции синхронного обмена данными
- •Примеры:
- •Задание 1:
- •Задание 2:
- •Задание 3:
- •Асинхронный обмен данными
- •Функции необходимые для асинхронного обмена данными
- •Пример:
- •Определение времени вычисления на Parsytec.
- •Определение времени в программе
- •Структура компьютера
- •Константы, типы данных, структуры mpi
- •Тип данных mpi_Datatype
- •Предопределённые константы
- •Сообщения
- •Функции mpi
- •Функция передачи данных с блокировкой
- •Дополнительные функции
- •Виды параллелизма Геометрический (распараллеливание по пространству)
- •Функциональный (распараллеливание по процессам)
- •Конвейерный
- •Параллелизм типа принятия коллективного решения
- •Ускорение и эффективность вычислений на мвс
- •Метод Рунге-Кутта 4
- •2. Расчётные формулы:
- •3. Алгоритм распараллеливания.
- •Метод прогноза коррекции
- •2. Расчётные формулы
- •3. Алгоритм распараллеливания.
- •4. Ускорение вычислений.
- •4. Ускорение и точность вычислений.
- •Решение уравнений в частных производных
- •Колебания мембраны
- •2. Расчетные формулы
- •Решение стационарных уравнений на мвс
- •2. Расчётные формулы
- •Алгоритм распараллеливания.
- •Ускорение вычислений
- •Оптимизация на мвс
- •Расчётные формулы
- •Алгоритм распараллеливания
- •Ускорение вычислений.
Примеры:
В заголовочном файле type.h определен тип byte:
typedef unsigned char byte;
Передача целых чисел
int m=5;
SendLink(NextLink, (byte*)&m, sizeof(int));
Действительные числа
float a;
RecvLink(Master, (byte*)&a, sizeof(float));
Одномерный массив
double b[m]; //m – константа определенная выше
SendLink(Slave, (byte*)&b, sizeof(double));
, b ,
, (byte*)b,
Двумерный массив
int c[n][m];
RecvLink(Link, (byte*)&c, n*m*sizeof(int));
Строка символов
char str[20];
int length;
strcpy(str, “сообщение”);
length=strlen(str)+1;
SendLink(PrevtLink, str, length);
Задание 1:
дана топология «дерево». С нулевого процессора разослать на все остальные некоторое целое число. Остальные процессоры его получают и печатают.
Входящие каналы связи – Master Выходящие - Slave #define n 2
LinkCB_t*Master, *Slave[n];
int size=sizeof(int), ID;
……….
if (MyProcID==0){
int m=12;
for (int i=0; i<n; i++) SendLink(Slave[i], (byte*)&m, size);
}
else{
int k=0;
RecvLink(Master, (byte*)&k, size);
for (int i=0; i<n; i++){
ID=MyProcID*n+i+1;
If (ID<nProcs)SendLink(Slave[i], (byte*)&k, size);
Else break;
}
}
printf(“MyProcID=%d k=%d\n”, MyProcID, k);
Задание 2:
дана топология «звезда». Рабочие процессоры пересылают на нулевой свои номера. Он получает их, суммирует и печатает эту сумму.
int size=sizeof(int);
………
if (MyProcID==0){
int k, sum=0;
for (int i=0; i<nworker; i++){
RecvLink(Slave[i], (byte*)&k, size);
Sum+=k; //sum=sum+k
}
printf(“MyProcID=%d sum=%d\n”, MyProcID, sum);
}
else{
int l= MyProcID;
SendLink(Master, (byte*)&l, size);
}
Задание 3:
дана топология «клика». Процессор с номером ID рассылает на все остальные некоторое действительное число. Они его получают и печатают.
int ID=5;
int sizef=sizeof(float);
if (MyProcID==ID){
float a=78.9;
for (int i=0; i<nProcs-1; i++)
SendLink(Link[i], (byte*)&a, sizef);
}
else{
float b=0;
int j;
j=( MyProcID>ID)?ID : ID-1;
RecvLink(Link[j], (byte*)&b, sizef);
Printf(“MyProcID=%d b=%f\n”, MyProcID, b);
}
Асинхронный обмен данными
Данный обмен программируется раздельно передающим и принимающим процессорами. Если процессор вышел на команду асинхронного обмена, то он не ждет пока другой процессор выйдет на аналогичную команду, а помещает в буфер информацию о виде команды обмена, адрес переменной, которая будет передана или куда будет записана, и размер в байтах принимаемой или передаваемой информации.
Записав эту информацию в буфер, процессор переходит к выполнению следующей команды. Фактически обмен происходит, когда в буферах соответствующих процессоров содержится информация об обмене.
При асинхронном обмене можно одновременно обмениваться информацией и проводить вычисления.
За время между обращением к функции асинхронного обмена и фактическим обменом значение переменной может быть изменено, т.к. в буфере хранится только ее адрес. Фактически будет передано то значение, которое имела данная переменная на момент реальной передачи.
При приеме может быть изменено значение принимаемой переменной, даже если она в это время участвовала в других операторах.