Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции - Чернышева.doc
Скачиваний:
7
Добавлен:
13.11.2019
Размер:
1.03 Mб
Скачать

Топологии Виды топологий

  1. Топология “Труба” (pipe)

  1. Топология “Кольцо”(ring)

  1. Топология “Звезда”(star)

  1. Топология “Клика” (clique)

  1. Топология “Решетка” (grid)

  1. Топология “Дерево” (tree)

  1. Топология “Гиперкуб” (hyperCube)

  1. Топология “Пирамида

  1. и другие.

Программирование «Трубы»

LinkCB_t*PrevLink, *NextLink;

Const int Reg=7; int error; …

Сособ 1:

If (MyProcID==0)

NextLink = ConnectLink(1, reg, &error);

If (MyProcID!=0) && (MyProcID!=nProcs-1) {

PrevLink = ConnectLink (MyProcID -1, reg, &error);

NextLink = ConnectLink (MyProcID+1, reg, &error);

}

If (MyProcID== nProcs-1)

PrevLink = ConnectLink (nProcs-2, reg, &error);

nProcs=5

nProcs-1=4

Связь устанавливается за nProcs-1 тактов по времени.

Сособ 2:

If (MyProcID!=0) PrevLink = ConnectLink (MyProcID -1, reg, &error);

If (MyProcID!= nProcs-1) NextLink = ConnectLink (MyProcID+1, reg, &error);

Сособ 3:

If (MyProcID%2) {# // Нечетные процессы

PrevLink = ConnectLink(MyProcID -1, reg, &error);

If (MyProcID!=nProcs-1) {NextLink = ConnectLink (MyProcID+1, reg, &error);}

else { // Четные процессы

If (MyProcID!=nProcs-1) NextLink = ConnectLink (MyProcID+1, reg, &error);

If (MyProcID!=0) PrevLink = ConnectLink (MyProcID -1, reg, &error);

}

Программирование «Звезды»

  1. известно число рабочих процессоров

# define nworker 5

LinkCB_t*Master, *Slave[nworker];

  1. число рабочих процессоров зависит от общего числа процессоров

LinkCB_t*Master, **Slave;

int nworker = nProcs-1;

slave = (LinkCB_t** ) maloc(nworker*sizeof(LinkCB_t*) );

// выделение памяти

If (MyProcID==0) for (int i=0; i< nworker; i++) Slave[i]=ConnectLink(i+1, reg, &error);

else Master=ConnectLink(0, reg, &error);

Программирование «Клика»

int i; // номер процессора

int j=0; // индекс канала связи

for (i=0; i< nProcs; i++)

If (i!=MyProcID) {

Slave[j]=ConnectLink(i, reg, &error);

Созданную топологию можно разрушить и создать новую. В любом месте программы можно установить новые каналы связи. При смене топологии значение переменных и констант сохраняется.

Синхронный обмен данными

Синхронный обмен данными программируется раздельно на передающем и получающем процессорах. В передающем процессоре программируется команда передачи по линку заданного числа байтов. В принимающем процессоре программируется команда приема по линку заданного числа байтов. Обмен происходит если передающий и принимающий процессоры выходят на команду обмена. Если один процессор вышел на команду обмена, то он ждет пока другой выйдет на свою команду обмена.

Неправильно запрограммированный обмен данными приведет к бесконечному ожиданию.

Функции синхронного обмена данными

  1. Прототип функции передачи данных

Функция возвращает целое число.

int SendLink(LinkCB_t*Link, void*Buf, int Size);

Функция SendLink передает Size байтов из Buf по каналу связи Link.

Функция возвращает число на самом деле переданных байтов.

  1. Прототип функции приема данных

int RecvLink(LinkCB_t*Link, void*Buf, int Size);

Функция принимает Size байтов в Buf по каналу связи Link.

Функция возвращает число на самом деле принятых байтов. Если параметр Size в RecvLink меньше Size в SendLink, то функция RecvLink возвращает -1, что является ошибкой.