Написание параллельной программы определяющей, сколько целых чисел, имеющих в качестве простых сомножителей 2, 3 или 5, лежит в диапазоне от M до N

Страницы работы

Содержание работы

Министерство Общего и Профессионального Образования РФ

Н Г Т У

Кафедра ВТ

Лабораторная работа №8 по дисциплине

”Вычислительные комплексы, системы и сети”

Факультет:          АВТ

Группа:                АМ – 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);

Похожие материалы

Информация о работе