IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Помогите исправить ошибку в программе для суперкомпьютера, СИ; MPI
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


Необходимо написать программу на 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();
}
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Хм... А кто синхронизировать будет?

Навскидку (проверять, естественно, сейчас негде) -
  MPI_Barrier(MPI_COMM_WORLD); // Как минимум не хватает...
MPI_Reduce(&sum,&otvet,1,MPI_FLOAT,MPI_SUM,0,MPI_COMM_WORLD);
+ вывод результата сделай в корневом процессе, а не во всех подряд...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 3.12.2008 1:35) *

Хм... А кто синхронизировать будет?

Навскидку (проверять, естественно, сейчас негде) -
  MPI_Barrier(MPI_COMM_WORLD); // Как минимум не хватает...
MPI_Reduce(&sum,&otvet,1,MPI_FLOAT,MPI_SUM,0,MPI_COMM_WORLD);
+ вывод результата сделай в корневом процессе, а не во всех подряд...


Спасибо, сделаю.

Я кажется понял почему у меня в результате всегда 0 выводит. В функции MPI_Reduce для операции MPI_SUM передаваемые операнды должны быть MPI типа. Но тогда функция printf выведет результат типа MPI_FLOAT ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.04.2024 16:25
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name