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

Примеры:

В заголовочном файле type.h определен тип byte:

typedef unsigned char byte;

  1. Передача целых чисел

int m=5;

SendLink(NextLink, (byte*)&m, sizeof(int));

  1. Действительные числа

float a;

RecvLink(Master, (byte*)&a, sizeof(float));

  1. Одномерный массив

double b[m]; //m – константа определенная выше

SendLink(Slave, (byte*)&b, sizeof(double));

, b ,

, (byte*)b,

  1. Двумерный массив

int c[n][m];

RecvLink(Link, (byte*)&c, n*m*sizeof(int));

  1. Строка символов

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);

}

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

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

Записав эту информацию в буфер, процессор переходит к выполнению следующей команды. Фактически обмен происходит, когда в буферах соответствующих процессоров содержится информация об обмене.

При асинхронном обмене можно одновременно обмениваться информацией и проводить вычисления.

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

При приеме может быть изменено значение принимаемой переменной, даже если она в это время участвовала в других операторах.