Параллельное программирование

avatar Reverie

653

12

Reverie

Участник команды сайта

Регистрация: 11.07.2013

Сообщения: 13254

Рейтинг: 26049

Reverie

Регистрация: 11.07.2013

Сообщения: 13254

Рейтинг: 26049

Нужна помощь с кодом на программу находящую число ПИ по второй формуле Лейбница(Pi=2*SquareRootOf3*(сумма от 0 до бесконечности(pow(-1,i)/pow(3,k)*(2*k+1)
Вот мой код(что-то в нем не так), нужно доделать/исправить, сам пол дня занимался этой хренью, уже глаза болят.
#include
#include
#include
#include
#include
int main(int argc,char* argv[])
{
double buf,Pi,PI=3.1415927,SquareRootOf3=1.73205,m=1000,N;
int rank,size,i1,i2,i,K;
MPI_Init(&argc,&argv);
MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
K=m/(size-1);
if (rank!=0)
{
i1=K*(rank-1);
i2=K*rank;
for (i=i1;i {
N=N+(pow(-1,i)/(pow(3,i)*(2*i+1)));
}
MPI_Send(&N,size-1,MPI_DOUBLE,0,rank,MPI_COMM_WORLD);
}
if (rank==0)
{
MPI_Recv(&N,size-1,MPI_DOUBLE,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
Pi=2*SquareRootOf3*buf;
printf("Pi is %d\n",Pi);
}
MPI_Finalize();
return(0);
}
Заплачу:
Auspicious Frost Owl's Beacon(60 центов)+мелочь с киви(примерно 40 рублей), может еще чего подкину.

Gwyndolin

Пользователь

Регистрация: 29.05.2014

Сообщения: 244

Рейтинг: 56

Gwyndolin

Регистрация: 29.05.2014

Сообщения: 244

Рейтинг: 56

В смысле находящую число Пи? Оно бесконечное

Reverie

Участник команды сайта

Регистрация: 11.07.2013

Сообщения: 13254

Рейтинг: 26049

Reverie

Регистрация: 11.07.2013

Сообщения: 13254

Рейтинг: 26049

Gwyndolin сказал(а):
В смысле находящую число Пи? Оно бесконечное
Нажмите, чтобы раскрыть...

Делаем определенное число итераций и находим приближенное значение. В моем случае их 1000. Чем больше будет это число, тем меньше будет разница между самим Пи и выведенным по формуле.

Gwyndolin

Пользователь

Регистрация: 29.05.2014

Сообщения: 244

Рейтинг: 56

Gwyndolin

Регистрация: 29.05.2014

Сообщения: 244

Рейтинг: 56

Just-_-Reverie сказал(а):
Делаем определенное число итераций и находим приближенное значение. В моем случае их 1000. Чем больше будет это число, тем меньше будет разница между самим Пи и выведенным по формуле.
Нажмите, чтобы раскрыть...

Я думаю это не лучшее место, здесь не знают ничего сложнее производных и первообразных(я не исключение). Тебе тут не помогут

Reverie

Участник команды сайта

Регистрация: 11.07.2013

Сообщения: 13254

Рейтинг: 26049

Reverie

Регистрация: 11.07.2013

Сообщения: 13254

Рейтинг: 26049

Gwyndolin сказал(а):
Я думаю это не лучшее место, здесь не знают ничего сложнее производных и первообразных(я не исключение). Тебе тут не помогут
Нажмите, чтобы раскрыть...

Ну может найдется хотя бы один программист со стажем.

AMDkrolyan

Пользователь

Регистрация: 21.04.2013

Сообщения: 7643

Рейтинг: 2908

AMDkrolyan

Регистрация: 21.04.2013

Сообщения: 7643

Рейтинг: 2908

Just-_-Reverie сказал(а):
Нужна помощь с кодом на программу находящую число ПИ по второй формуле Лейбница(Pi=2*SquareRootOf3*(сумма от 0 до бесконечности(pow(-1,i)/pow(3,k)*(2*k+1)
Вот мой код(что-то в нем не так), нужно доделать/исправить, сам пол дня занимался этой хренью, уже глаза болят.
#include
#include
#include
#include
#include
int main(int argc,char* argv[])
{
double buf,Pi,PI=3.1415927,SquareRootOf3=1.73205,m=1000,N;
int rank,size,i1,i2,i,K;
MPI_Init(&argc,&argv);
MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
K=m/(size-1);
if (rank!=0)
{
i1=K*(rank-1);
i2=K*rank;
for (i=i1;i {
N=N+(pow(-1,i)/(pow(3,i)*(2*i+1)));
}
MPI_Send(&N,size-1,MPI_DOUBLE,0,rank,MPI_COMM_WORLD);
}
if (rank==0)
{
MPI_Recv(&N,size-1,MPI_DOUBLE,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
Pi=2*SquareRootOf3*buf;
printf("Pi is %d\n",Pi);
}
MPI_Finalize();
return(0);
}
Заплачу:
Auspicious Frost Owl's Beacon(60 центов)+мелочь с киви(примерно 40 рублей), может еще чего подкину.
Нажмите, чтобы раскрыть...


#include
в двух словах что это за библиотека?

и конкретные ошибки назови

Errathy

Пользователь

Регистрация: 31.05.2014

Сообщения: 179

Рейтинг: 158

Errathy

Регистрация: 31.05.2014

Сообщения: 179

Рейтинг: 158

#include
#include
#include

const double PI = 3.1415927;
const double SquareRootOf3 = 1.73205;
const int sumIterationNumber = 1000;

int main( int argc, char* argv[] )
{

MPI_Init( &argc, &argv );

MPI_Status status;

double buffer = 0.0;

double result = 0.0;

int numberOfProcesses = 0;

int numberOfCurProcess = 0;

MPI_Comm_size( MPI_COMM_WORLD, &numberOfProcesses );

if( numberOfProcesses == 1 ) {


int start = 0;


int end = sumIterationNumber;


double result = 0.0;


for( int i = start; i < end; ++i ) {



result += ( pow( -1, i ) / ( pow( 3, i ) * ( 2 * i + 1 ) ) );


}


double ourPi = 2 * SquareRootOf3 * result;


std::cout << "Our result: "<< ourPi << ". Real PI: " << PI << ". Difference: " << std::abs( ourPi - PI ) << "." << std::endl;

} else {


MPI_Comm_rank( MPI_COMM_WORLD, &numberOfCurProcess );


int oneProccesWork = sumIterationNumber / ( numberOfProcesses - 1 );


if( numberOfCurProcess != 0 ) {



int start = oneProccesWork * ( numberOfCurProcess - 1 );



int end = oneProccesWork * numberOfCurProcess;



if( numberOfCurProcess == numberOfProcesses - 1 ) {




end = sumIterationNumber;



}



double processPart = 0.0;



for( int i = start; i < end; ++i ) {




processPart += ( pow( -1, i ) / ( pow( 3, i ) * ( 2 * i + 1 ) ) );



}



MPI_Send( &processPart, 1, MPI_DOUBLE, 0, numberOfProcesses, MPI_COMM_WORLD );


}


if( numberOfCurProcess == 0 ) {



double result = 0.0;



for( int i = 1; i < numberOfProcesses; ++i ) {




double temp = 0.0;




MPI_Recv( &temp, 1, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status );




result += temp;



}



double ourPi = 2 * SquareRootOf3 * result;



std::cout << "Our result: "<< ourPi << ". Real PI: " << PI << ". Difference: " << std::abs( ourPi - PI ) << "." << std::endl;


}

}

MPI_Finalize();

return 0;
}


Что-то вроде этого наверно. У меня MPI_Comm_size( MPI_COMM_WORLD, &numberOfProcesses ) все время выдает всего 1 процесс, поэтому нормально потестить не вышло.

TopSandKing2001

Пользователь

Регистрация: 13.10.2014

Сообщения: 309

Рейтинг: 135

TopSandKing2001

Регистрация: 13.10.2014

Сообщения: 309

Рейтинг: 135

много букаф, не дочитал

Reverie

Участник команды сайта

Регистрация: 11.07.2013

Сообщения: 13254

Рейтинг: 26049

Reverie

Регистрация: 11.07.2013

Сообщения: 13254

Рейтинг: 26049

AMDkrolyan сказал(а):
#include
в двух словах что это за библиотека?

и конкретные ошибки назови
Нажмите, чтобы раскрыть...

Библиотека MPI, нужна для работы на нескольких процессорах суперкомпьютера(кластера)
Ошибок нет, но ответ выводит не верный.
Errathy сказал(а):
#include
#include
#include

const double PI = 3.1415927;
const double SquareRootOf3 = 1.73205;
const int sumIterationNumber = 1000;

int main( int argc, char* argv[] )
{

MPI_Init( &argc, &argv );

MPI_Status status;

double buffer = 0.0;

double result = 0.0;

int numberOfProcesses = 0;

int numberOfCurProcess = 0;

MPI_Comm_size( MPI_COMM_WORLD, &numberOfProcesses );

if( numberOfProcesses == 1 ) {


int start = 0;


int end = sumIterationNumber;


double result = 0.0;


for( int i = start; i < end; ++i ) {



result += ( pow( -1, i ) / ( pow( 3, i ) * ( 2 * i + 1 ) ) );


}


double ourPi = 2 * SquareRootOf3 * result;


std::cout << "Our result: "<< ourPi << ". Real PI: " << PI << ". Difference: " << std::abs( ourPi - PI ) << "." << std::endl;

} else {


MPI_Comm_rank( MPI_COMM_WORLD, &numberOfCurProcess );


int oneProccesWork = sumIterationNumber / ( numberOfProcesses - 1 );


if( numberOfCurProcess != 0 ) {



int start = oneProccesWork * ( numberOfCurProcess - 1 );



int end = oneProccesWork * numberOfCurProcess;



if( numberOfCurProcess == numberOfProcesses - 1 ) {




end = sumIterationNumber;



}



double processPart = 0.0;



for( int i = start; i < end; ++i ) {




processPart += ( pow( -1, i ) / ( pow( 3, i ) * ( 2 * i + 1 ) ) );



}



MPI_Send( &processPart, 1, MPI_DOUBLE, 0, numberOfProcesses, MPI_COMM_WORLD );


}


if( numberOfCurProcess == 0 ) {



double result = 0.0;



for( int i = 1; i < numberOfProcesses; ++i ) {




double temp = 0.0;




MPI_Recv( &temp, 1, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status );




result += temp;



}



double ourPi = 2 * SquareRootOf3 * result;



std::cout << "Our result: "<< ourPi << ". Real PI: " << PI << ". Difference: " << std::abs( ourPi - PI ) << "." << std::endl;


}

}

MPI_Finalize();

return 0;
}


Что-то вроде этого наверно. У меня MPI_Comm_size( MPI_COMM_WORLD, &numberOfProcesses ) все время выдает всего 1 процесс, поэтому нормально потестить не вышло.
Нажмите, чтобы раскрыть...

Спасибо, пока ошибки все исправлю, потом отпишусь.

ShadowFromRussia

Пользователь

Регистрация: 03.01.2014

Сообщения: 980

Рейтинг: 233

ShadowFromRussia

Регистрация: 03.01.2014

Сообщения: 980

Рейтинг: 233

Численные методы.. Всегда ненавидел эти ряды кодить..

Reverie

Участник команды сайта

Регистрация: 11.07.2013

Сообщения: 13254

Рейтинг: 26049

Reverie

Регистрация: 11.07.2013

Сообщения: 13254

Рейтинг: 26049

ShadowFromRussia сказал(а):
Численные методы.. Всегда ненавидел эти ряды кодить..
Нажмите, чтобы раскрыть...

Это параллельное программирование, здесь надо разбивать решение на несколько процессоров, на простом С++ это намного легче.

ShadowFromRussia

Пользователь

Регистрация: 03.01.2014

Сообщения: 980

Рейтинг: 233

ShadowFromRussia

Регистрация: 03.01.2014

Сообщения: 980

Рейтинг: 233

Не преподавали тогда программирование на несколько процессоров. Два ядра-то лишь только-только появились на рынке тогда..

Поправка: погуглил. учил эту лабуду в универе в 2003, а 2ядра появились даже позже, в 2005.

Reverie

Участник команды сайта

Регистрация: 11.07.2013

Сообщения: 13254

Рейтинг: 26049

Reverie

Регистрация: 11.07.2013

Сообщения: 13254

Рейтинг: 26049

Errathy сказал(а):
#include
#include
#include

const double PI = 3.1415927;
const double SquareRootOf3 = 1.73205;
const int sumIterationNumber = 1000;

int main( int argc, char* argv[] )
{

MPI_Init( &argc, &argv );

MPI_Status status;

double buffer = 0.0;

double result = 0.0;

int numberOfProcesses = 0;

int numberOfCurProcess = 0;

MPI_Comm_size( MPI_COMM_WORLD, &numberOfProcesses );

if( numberOfProcesses == 1 ) {


int start = 0;


int end = sumIterationNumber;


double result = 0.0;


for( int i = start; i < end; ++i ) {



result += ( pow( -1, i ) / ( pow( 3, i ) * ( 2 * i + 1 ) ) );


}


double ourPi = 2 * SquareRootOf3 * result;


std::cout << "Our result: "<< ourPi << ". Real PI: " << PI << ". Difference: " << std::abs( ourPi - PI ) << "." << std::endl;

} else {


MPI_Comm_rank( MPI_COMM_WORLD, &numberOfCurProcess );


int oneProccesWork = sumIterationNumber / ( numberOfProcesses - 1 );


if( numberOfCurProcess != 0 ) {



int start = oneProccesWork * ( numberOfCurProcess - 1 );



int end = oneProccesWork * numberOfCurProcess;



if( numberOfCurProcess == numberOfProcesses - 1 ) {




end = sumIterationNumber;



}



double processPart = 0.0;



for( int i = start; i < end; ++i ) {




processPart += ( pow( -1, i ) / ( pow( 3, i ) * ( 2 * i + 1 ) ) );



}



MPI_Send( &processPart, 1, MPI_DOUBLE, 0, numberOfProcesses, MPI_COMM_WORLD );


}


if( numberOfCurProcess == 0 ) {



double result = 0.0;



for( int i = 1; i < numberOfProcesses; ++i ) {




double temp = 0.0;




MPI_Recv( &temp, 1, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status );




result += temp;



}



double ourPi = 2 * SquareRootOf3 * result;



std::cout << "Our result: "<< ourPi << ". Real PI: " << PI << ". Difference: " << std::abs( ourPi - PI ) << "." << std::endl;


}

}

MPI_Finalize();

return 0;
}


Что-то вроде этого наверно. У меня MPI_Comm_size( MPI_COMM_WORLD, &numberOfProcesses ) все время выдает всего 1 процесс, поэтому нормально потестить не вышло.
Нажмите, чтобы раскрыть...

Выдает очень большие значения числа Пи ;( Все равно спасибо за помощь.