Министерство образование и науки РФ
Санкт-Петербургский государственный электротехнический университет
Дисциплина «Параллельное программирование»
Кафедра МОЭВМ
Лабораторная работа №1 ”Исследование структуры транспьютерной сети”
Выполнил: |
студент гр. 3351 Фонарева С. |
Преподаватель: |
Красюк В.И. |
Санкт-Петербург
2008
Задание
-
Написать программу ,выводящую на экран сообщение, например,”HI!”. Откомпилировать ее и запустить на 1,2, и т.д. процессорах.
-
Модифицировать программу так, чтобы при этом выводился номер процессора, на котором программа выполняется.
-
Модифицировать программу так, чтобы выводились не только идентификаторы процессоров, но и его “соседи”,а также размерность сети. Откомпилировать и запустить на 1,2, и т.д. процессорах. Проанализировать полученные результаты, сделать вывод о структур транспьютерной сети.
Постановка задачи
-
Написать программу выдающую сообщения вида:
printf (" Hi!!! \n");
printf ("Me is : ID = %d \n", MyProcID);
-
Написать программу ,выводящую на экран номер процессора на котором она выполняется.
printf (" Hi!!! \n");
printf ("Me is : ID = %d \n", MyProcID);
-
а также номер всех соседних элементов (общее количество процессоров на которых запущена программа; размерности сети по 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;
}