Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2012, 19:55   #1
Brabus
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 81
По умолчанию Параллельные алгоритмы. Вычисление суммы ряда (С++)

Всем добрый вечер. Сделал программу, которая вычисляет сумму ряда так сказать "в строчку"
Как она работает:

1->2->3->4
********|
------------
|
5->6->7->8

При входе в программу мы задаём количество итераций. При i=1 мы вычисляем начальную сумму, при последующих проходах мы вычисляем и прибавляем к сумме только слагаемые ряда.

Код:
#include "mpi.h"
#include <stdio.h>
#include <math.h>
#include <iostream>

using namespace std;

double f(double a)
{
    return ((12.0*a*a-1.0)/(a*((4.0*a*a-1)*(4.0*a*a-1))));
	//return 1 / fact(a);
}

int main(int argc,char *argv[])
{
    int done = 0, n, myid, numprocs, i;
    double pi, sum;
    double startwtime = 0.0, endwtime;
    int  namelen, from, to;
    char processor_name[MPI_MAX_PROCESSOR_NAME];
	MPI_Status status;

    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD,&myid);
    MPI_Get_processor_name(processor_name,&namelen);

    while (!done) {
        if (myid == 0) {
            fprintf(stdout, "Enter the number of intervals: (0 quits) ");
	    fflush(stdout);
            if (scanf("%d",&n) != 1) {
		fprintf( stdout, "No number entered; quitting\n" );
		n = 0;
	    }
	    startwtime = MPI_Wtime();
        }
        MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
        if (n == 0)
            done = 1;
        else {
            sum = 0.0;

			if(myid != 0)
				from = myid - 1;
			else
				from = numprocs - 1;

			if(myid != numprocs - 1)
				to = myid + 1;
			else
				to = 0;

			int z, z1;


            for (i = myid + 1; i <= n; i += numprocs) {
				if(i == 1 && n == 1)
				{
					sum += f(i);
				}
				if(i == 1 && i != n)
				{
					z = 1;
					z1=z+2;
					sum += (12.*i*i-1)/(i*(z*z1)*(z*z1));
					printf("myid - %d, to - %d, z - %d, z1 - %d\n",myid, to, z, z1); fflush(stdout);
					//cout >> "myid - " >> myid >> "to - " >> to >> "z - " >> z >> "z1 - " >> z1 >> "sum - " >> sum >> endl;
					cout << "sum = " << sum << endl;
					MPI_Send(&z1, 1, MPI_INT, to, 0, MPI_COMM_WORLD);
				}
				if(i != 1 && i != n)
				{
					MPI_Recv(&z, 1, MPI_INT, from, 0, MPI_COMM_WORLD, &status);
					//z+=2;
					z1=z+2;
					sum += (12.*i*i-1)/(i*(z*z1)*(z*z1)); 
					printf("myid - %d, to - %d, z - %d, z1 - %d\n",myid, to, z, z1); fflush(stdout);
					cout << "sum = " << sum << endl;
					MPI_Send(&z1, 1, MPI_INT, to, 0, MPI_COMM_WORLD);
				}
				if(i == n)
				{
					MPI_Recv(&z, 1, MPI_INT, from, 0, MPI_COMM_WORLD, &status);
					//z+=2;
					z1=z+2;
					sum += (12.*i*i-1)/(i*(z*z1)*(z*z1)); 
					printf("myid - %d, to - %d, z - %d, z1 - %d\n",myid, to, z, z1); fflush(stdout);
					cout << "sum = " << sum << endl;
				}
            }
            MPI_Reduce(&sum, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

            if (myid == 0) {
                printf("pi is approximately %.16f, Error is %.16f\n",
                       pi, fabs(pi - 2*log(2.)));
		endwtime = MPI_Wtime();
		printf("wall clock time = %f\n", endwtime-startwtime);	       
		fflush( stdout );
	    }
        }
    }
    MPI_Finalize();
    return 0;
}
Простите за названия переменных Это была тестовая задача, в кратце описывающая работу MPI и преподаватель нам сказал модифицировать её под последующие задачи.

Программа работает, но сумму считает неправильно. Пожалуйста помогите найти ошибку.

Последний раз редактировалось Brabus; 26.03.2012 в 19:59.
Brabus вне форума Ответить с цитированием
Старый 27.03.2012, 17:38   #2
Brabus
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 81
По умолчанию

Разобрался
Brabus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычисление суммы ряда druger Помощь студентам 1 30.09.2011 18:58
VB Вычисление суммы ряда LenZab Помощь студентам 0 20.05.2011 23:18
Вычисление суммы ряда в С++ Tador Помощь студентам 21 10.12.2010 00:49
Вычисление суммы ряда. Си kira_truelove Помощь студентам 4 10.10.2010 21:36