Необходимо написать программу на MPI, вычисляющую определенный интеграл 1/(x*x+9) методом трапеций на разном количестве процессоров от 1 до 10.
Программа при любом количестве процессоров выводит результат 0. Программа правильно вычисляет прощади маленьких прямоугольников, но функция MPI_Reduce их не суммирует. Подскажите, правильно ли я использую эту функцию? Или подскажите плиз другую функцию, которую можно было бы использовать вместо этой.
#include <mpi.h>
#include <stdio.h>
main(int argc,char *argv[])
{
int size,len,rank;
float h,sum,n=1000,x,i=0;
double otvet=0;
char name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Get_processor_name(name, &len);
printf("Process %d, Processor %s\n",rank,name);
h=1./n;
while (i<=n)
{
x=i*h;
if ((i==0)||(i==n)) sum=1./((x*x)+9);
else sum=2*(1./((x*x)+9));
i++;
}
MPI_Reduce(&sum,&otvet,1,MPI_FLOAT,MPI_SUM,0,MPI_COMM_WORLD);
otvet*=h/2.;
printf("Rezultat=%f\n",otvet);
MPI_Finalize();
}
Хм... А кто синхронизировать будет?
Навскидку (проверять, естественно, сейчас негде) -
MPI_Barrier(MPI_COMM_WORLD); // Как минимум не хватает...+ вывод результата сделай в корневом процессе, а не во всех подряд...
MPI_Reduce(&sum,&otvet,1,MPI_FLOAT,MPI_SUM,0,MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD); // Как минимум не хватает...+ вывод результата сделай в корневом процессе, а не во всех подряд...
MPI_Reduce(&sum,&otvet,1,MPI_FLOAT,MPI_SUM,0,MPI_COMM_WORLD);
А сами таблицы, на которые ссылаются на том сайте, видел? Вот они, причем в оригинале:
http://www.manpagez.com/man/3/MPI_Reduce/... А вот цитата оттуда:
Now, the valid datatypes for each option is specified below.
Op Allowed Types
---------------- ---------------------------
MPI_MAX, MPI_MIN C integer, Fortran integer,
floating-point
MPI_SUM, MPI_PROD C integer, Fortran integer,
floating-point, complex
MPI_LAND, MPI_LOR, C integer, logical
MPI_LXOR
MPI_BAND, MPI_BOR, C integer, Fortran integer, byte
MPI_BXOR
Ты на чем проверяешь программу? В смысле, какой MPI у тебя, и аппаратура какая? Кластер?
вопрос еще актуален?