Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 1.doc
Скачиваний:
14
Добавлен:
01.05.2014
Размер:
200.7 Кб
Скачать

Министерство образование и науки РФ

Санкт-Петербургский государственный электротехнический университет

Дисциплина «Параллельное программирование»

Кафедра МОЭВМ

Лабораторная работа №1 ”Исследование структуры транспьютерной сети”

Выполнил:

студент гр. 3351

Фонарева С.

Преподаватель:

Красюк В.И.


Санкт-Петербург

2008

Задание

    1. Написать программу ,выводящую на экран сообщение, например,”HI!”. Откомпилировать ее и запустить на 1,2, и т.д. процессорах.

    2. Модифицировать программу так, чтобы при этом выводился номер процессора, на котором программа выполняется.

    3. Модифицировать программу так, чтобы выводились не только идентификаторы процессоров, но и его “соседи”,а также размерность сети. Откомпилировать и запустить на 1,2, и т.д. процессорах. Проанализировать полученные результаты, сделать вывод о структур транспьютерной сети.

Постановка задачи

    1. Написать программу выдающую сообщения вида:

printf (" Hi!!! \n");

printf ("Me is : ID = %d \n", MyProcID);

    1. Написать программу ,выводящую на экран номер процессора на котором она выполняется.

printf (" Hi!!! \n");

printf ("Me is : ID = %d \n", MyProcID);

    1. а также номер всех соседних элементов (общее количество процессоров на которых запущена программа; размерности сети по X, Y, Z.)

Идентификаторы соседей можно получить, в общем случае, следующим образом:

Следующий сосед = MyZ*DimX*DimY + (MyY*DimX) + (MyX+1)

Предыдущий сосед = MyZ*DimX*DimY + (MyY*DimX) + (MyX-1)

Сосед сверху = MyZ*DimX*DimY + ((MyY+1)*DimX) + (MyX)

Сосед снизу = MyZ*DimX*DimY + ((MyY-1)*DimX) + MyX,

Где MyZ, MyY, MyX, DimX, DimY, DimZ- поля структуры RootProc_t :

typedef struct

{

int MyProcID;

int MyX;

int MyY;

int MyZ;

int nProcs;

int DimX;

int DimY;

int DimZ;

} RootProc_t;

причем MyX = MyY и способны принимать значеия из диапазона [0…3],

DimX =DimY и способны принимать значеия из диапазона [1…4],

DimZ = 1 =const.

Поскольку пункты задания являются этапами разработки,приводящими к получению программы удовлетворяющей 3-му пункту задания,то в отчете приводится только текст окончательного ее варианта.

Тексты программы

#include<stdio.h>

#include<sys/root.h>

int main(void)

{

//объявление переменных

int ID, myx, myy, myz, dimx, dimy, dimz, numbproc, next, prev, up, low ;

//получение значений полей структуры RootProc_t

//идентификатор процессора

ID=GET_ROOT()->ProcRoot->MyProcID;

//коорддината процессора по X

myx=GET_ROOT()->ProcRoot->MyX;

//коорддината процессора по Y

myy=GET_ROOT()->ProcRoot->MyY;

//коорддината процессора по Z

myz=GET_ROOT()->ProcRoot->MyZ;

//размерность сети процессоров по X

dimx=GET_ROOT()->ProcRoot->DimX;

//размерность сети процессоров по Y

dimy=GET_ROOT()->ProcRoot->DimY;

//размерность сети процессоров по Z

dimz=GET_ROOT()->ProcRoot->DimZ;

//размерность решающего поля процессоров

numbproc = GET_ROOT()->ProcRoot->nProcs;

next = -1;

prev = -1;

up = -1;

low = -1;

//информация о процессоре,на котором запущена программа

printf ("Me is : ProcID = %d, MyX = %d, MyY = %d, MyZ = %d, DimX = %d, DimY = %d, DimZ = %d, FROM numproc = %d\n", ID, myx, myy, myz, dimx, dimy, dimz, numbproc);

//вычисление соседей данного процессора

printf ("NEIGHBOURS:");

if (myx<dimx-1)

{ next = myz*dimx*dimy + (myy*dimx) + (myx+1); }

if (myx > 0)

{ prev = myz*dimx*dimy + (myy*dimx) + (myx-1); }

if (myy<dimy-1)

{ up = myz*dimx*dimy + ((myy+1)*dimx) + (myx); }

if (myy>0)

{ low = myz*dimx*dimy + ((myy-1)*dimx) + myx; }

//вывод результата

printf ("[ID: %3d] ->%3d \\/%3d <-%3d /\\%3d\n", ID, next, low, prev, up);

return 0;

}