- •Содержание курса
- •Общие сведения.
- •Топологии Виды топологий
- •Программирование «Трубы»
- •Программирование «Звезды»
- •Программирование «Клика»
- •Синхронный обмен данными
- •Функции синхронного обмена данными
- •Примеры:
- •Задание 1:
- •Задание 2:
- •Задание 3:
- •Асинхронный обмен данными
- •Функции необходимые для асинхронного обмена данными
- •Пример:
- •Определение времени вычисления на Parsytec.
- •Определение времени в программе
- •Структура компьютера
- •Константы, типы данных, структуры mpi
- •Тип данных mpi_Datatype
- •Предопределённые константы
- •Сообщения
- •Функции mpi
- •Функция передачи данных с блокировкой
- •Дополнительные функции
- •Виды параллелизма Геометрический (распараллеливание по пространству)
- •Функциональный (распараллеливание по процессам)
- •Конвейерный
- •Параллелизм типа принятия коллективного решения
- •Ускорение и эффективность вычислений на мвс
- •Метод Рунге-Кутта 4
- •2. Расчётные формулы:
- •3. Алгоритм распараллеливания.
- •Метод прогноза коррекции
- •2. Расчётные формулы
- •3. Алгоритм распараллеливания.
- •4. Ускорение вычислений.
- •4. Ускорение и точность вычислений.
- •Решение уравнений в частных производных
- •Колебания мембраны
- •2. Расчетные формулы
- •Решение стационарных уравнений на мвс
- •2. Расчётные формулы
- •Алгоритм распараллеливания.
- •Ускорение вычислений
- •Оптимизация на мвс
- •Расчётные формулы
- •Алгоритм распараллеливания
- •Ускорение вычислений.
Функции необходимые для асинхронного обмена данными
Прототипы функций находится в следующем заголовочном файле:
#include <sys/topology.h>
int NewTop (int nLinks);
Функция NewTop реализует новую топологию. Она создает внутреннюю топологическую таблицу с nLinks, как предполагаемым числом линков.
Функция возвращает переменную целого типа, которая идентифицирует новую топологию.
int FreeTop (int TopID);
Функция FreeTop освобождает топологию с идентификатором TopID. Она освобождает все каналы т связи.
Функция возвращает 0 в случае удачного завершения или отрицательное число как код ошибки.
int AddTop (int TopID, LinkCB_t*Link);
Функция AddTop в топологии с идентификаторм TopID каналу связи Link ставит в соответствие некоторое число, которое является логическим именем данного канала связи.
#include <sys/comm.h>
int AIint (int TopID, int Threads, int size);
Функция AIint инициализирует поля структур, использующих функции асинхронного обмена.
TopID – идентификатор топологии;
Threads – максимальное число потоков использующихся в асинхронном обмене. Если Threads= -1, то “нет ограничений” по числу потоков.
size– максимальный объем памяти, необходимый для асинхронного обмена. Если size = -1, то “нет ограничений”.
Функция возвращает 0 в случае удачного завершения или код ошибки.
int AExit (int TopID);
Функция AExit деинициализирует структуры с функциями асинхронного обмена в топологии с идентификатором TopID
Функция возвращает 0 в случае удачного завершения или код ошибки.
int ASend (int TopID, int LogLinkID, void*buf, int size, int*result);
int ARecv (int TopID, int LogLinkID, void*buf, int size, int*result);
TopID – идентификатор топологии;
LogLinkID – логическое имя линка;
void*buf – адрес переменной, которая будет передана/ адрес переменной, которая будет записана;
size – размер в байтах полученной или передаваемой информации;
result - адрес переменной целого типа куда будет записана ошибка.
Пример:
#include <sys/root.h>
#include <sys/topology.h>
#include <sys/comm.h>
#include <stdio.h>
#include <math.h>
# define nLinks 1
# define n 6
# define Reg 11
void Pouse(int k) {
int i;
for ( i=0; i<k; i++) sin(i);
}
int main() {
int MyProcID;TopID = NewTop(nLinks);I; LogLinkID;error; LinkCB_t*Link;
MyProcID = GetRoot()->ProcRoot-Ю>MyProcID;
if (MyProcID==0) Link = ConnectLink(1, reg, &error)
else Link = ConnectLink(0, reg, &error);
LogLinkID=AddTop(TopID, Link);
error = AIint (TopID, nLinks, -1);
if (error) {
printf(“Ошибка инициализации\n ”)
exit(1);
}
else printf(“MyProcID =%d инициализация прошла успешно\n ” MyProcID);
if (MyProcID==0) {
int a[n];
for ( i=0; i<n; i++) a[i]=3;
ARecv (TopID, LogLinkID, a,n*sizeof(int), &error);
for ( i=0; i<n; i++) {
printf(“%d ”, a[i]);
if (!((i+1)%20) printf(“\n”));
}
}
else {
int b[n];
for ( i=0; i<n; i++) a[i]=5;
pause(2000);
ASend (TopID, LogLinkID, b,n*sizeof(int), &error);
}
error = AExit (TopID);
FreeTop (int TopID);
return error;
}
На экране: