Министерство Общего и Профессионального Образования РФ
Н Г Т У
”Вычислительные комплексы, системы и сети”
Факультет: АВТ
Группа: АМ – 811
Студент: Курамшин А.А.
г. Новосибирск
2002г.
1. Техническое задание:
Написать параллельную программу определяющую, сколько целых чисел, имеющих в качестве простых сомножителей только 2, 3 или 5, лежит в диапазопе от M до N.
Входные параметры программы: M - нижняя граница диапазона поиска, N - верхняя граница диапазона поиска.
2. Описание работы программы:
На одном из компьютеров в сетевом кластере пользователь вводит нижнюю и верхнюю границы диапазона поиска. Диапазон делится на равные части, и отрезки рассылаются всем машинам кластера. Деления на равные части делается для равномерного распределения вычислительной мощности, которую необходимо затратить на поиск чисел. На каждой из машин выводится диапазон, который он получила и производится поиск удовлетворяющих условию чисел, затем их количество подсчитывается и результат отсылается машине, инициировавшей задачу. На которой, в свою очередь, уже суммируются все полученные ее таким образом значения, причем учитывается результат работы и “главной” машины.
3. Пример работы программы:
Установлена сессия со всеми участниками.
На любой из машин вводится диапазон поиска, который разбивается на равные части и рассылается всем участникам. На эту же машину возвращается результат
4. Текст программы:
Т.к. в предыдущих работах уже были представлены тексты реализации команд NETBIOS и функций библиотеки MPI, поэтому здесь представлены только функции, отвечающие за работу конкретного приложения
void calculate()//Функция рассылки и обработки диапазона
{
STATUS_INFO info;
char name[16], temp_buf[BUF_LEN], *temp;
int i, j, type, offset, j1, j2, N;
int in;
byte reply;
double result=0;
strncpy(temp_buf, buf, BUF_LEN);
MPI_Recv(buf, BUF_LEN, MPI_ANY_SOURCE, MPI_COMM_WORLD);
name_status(MPI_COMM_WORLD, MPI_COMM_WORLD.name, &info);
for (i = 0; i < info.session_count; i++)
if (info.session_data[i].lsn == MPI_COMM_WORLD.temp_ncb.NCB_LSN)
{
strcpy(name, info.session_data[i].remote_name);
break;
}
if (!strstr(name, "Point№"))
return;
temp = name + 6;
reply = atoi(temp);
offset = 6;
sscanf(temp_buf, "%d",&type);
itoa(type, temp, 10);
offset += strlen(temp);
if(type==1)
{
sscanf(temp_buf+strlen(temp), "%d%d%d",&N, &j1, &j2);
itoa(N, temp, 10);
offset += strlen(temp);
itoa(j1, temp, 10);
offset += strlen(temp);
itoa(j2, temp, 10);
offset += strlen(temp);
strcpy(temp_buf, temp_buf + offset);
}
if(type==2)
{
type=0; result=10;
sscanf(temp_buf, "%d%f",&type,&result);
strcpy(temp,temp_buf+offset);
result=atof(temp_buf+2);
offset += strlen(temp);
strcpy(temp_buf, temp_buf + offset);
}
switch(type)
{
case 1://Машина обрабатывает присланный ей диапазон
printf("Point№%d прислал задание\n", reply);
printf("Считаю интервал от %d до %d\n ",j1, j2);
for (j = j1; j <= j2; j++)
{
if (j % 2 == 0) {result ++; printf("%d ", j); continue;}
if (j % 3 == 0) {result ++; printf("%d ", j); continue;}
if (j % 5 == 0) {result ++; printf("%d ", j); continue;}
}
puts("");
strset(temp_buf, 0);
sprintf(temp,"%d %2.2f",2,result);
strcat(temp_buf, temp);
//Посылаем результат
MPI_Send(temp_buf, strlen(temp_buf)+1, reply, MPI_COMM_WORLD);
break;
case 2://на главной машине ведедтся подсчет присланных ей значений
if (MPI_COMM_WORLD.answer[reply] != 0)
return;
MPI_COMM_WORLD.answer[reply] = 1;
printf("Point№%d прислал результат ",reply);
sscanf(temp_buf, " %+2.2f", &result);
printf(" %2.2f\n",result);
MPI_COMM_WORLD.summa += result;
MPI_COMM_WORLD.ack--;
if (!MPI_COMM_WORLD.ack)
{
timeb fin;
float div;
ftime(&fin);
div = ((fin.time - MPI_COMM_WORLD.time_sec)*1000 +
(fin.millitm - MPI_COMM_WORLD.time_mili));
printf("*Вычисления завершены. Затраты времени %6.3f секунд", div/1000);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.