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

> Внимание!

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

 
 Ответить  Открыть новую тему 
> Помогите исправить ошибку в программе для суперкомпьютера, СИ; MPI
Neon6868
сообщение 2.12.2008 23:51
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.12.2008 0:35
Сообщение #2


Гость






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

Навскидку (проверять, естественно, сейчас негде) -
  MPI_Barrier(MPI_COMM_WORLD); // Как минимум не хватает...
  MPI_Reduce(&sum,&otvet,1,MPI_FLOAT,MPI_SUM,0,MPI_COMM_WORLD);
+ вывод результата сделай в корневом процессе, а не во всех подряд...
 К началу страницы 
+ Ответить 
Neon6868
сообщение 3.12.2008 1:31
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.12.2008 2:22
Сообщение #4


Гость






Цитата
В функции MPI_Reduce для операции MPI_SUM передаваемые операнды должны быть MPI типа
Это ты с чего взял? Прекрасно MPI_Reduce работает и с float и с double.
 К началу страницы 
+ Ответить 
Neon6868
сообщение 3.12.2008 18:03
Сообщение #5


Пионер
**

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

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


Цитата(volvo @ 3.12.2008 3:22) *

Это ты с чего взял? Прекрасно MPI_Reduce работает и с float и с double.


Я на сайте http://skif.bas-net.by/bsuir/mpi-1-std/node81.html прочитал "Предопределенные операции работают только с типами MPI , описанными в разделах 4.9.2 и 4.9.3." Это не верно?

Тогда моя программа неправильно работает только из-за того, что я не сделал синхронизацию?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.12.2008 19:52
Сообщение #6


Гость






А сами таблицы, на которые ссылаются на том сайте, видел? Вот они, причем в оригинале:
manpagez: man MPI_Reduce(3)... А вот цитата оттуда:
       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
Обратил внимание на присутствие floating-point типов для MPI_SUM? Вот и все, значит, тебе никто не запрещает использовать тип данных MPI_FLOAT и float-переменную в качестве буфера... Или тип MPI_DOUBLE и переменную типа double

Цитата
Тогда моя программа неправильно работает только из-за того, что я не сделал синхронизацию?
Ничего себе "только". Ты ж сам говоришь, что все процессы по отдельности считают площади... А вместе-не собирается... Чего не хватает по-твоему?
 К началу страницы 
+ Ответить 
Neon6868
сообщение 3.12.2008 22:08
Сообщение #7


Пионер
**

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

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


Цитата(volvo @ 3.12.2008 20:52) *

Ничего себе "только". Ты ж сам говоришь, что все процессы по отдельности считают площади... А вместе-не собирается... Чего не хватает по-твоему?


Я думаю, что с помощью MPI_Reduce все эти площади и должны суммироваться в одну переменную. Или еще чего-то не хватает, кроме синхронизации?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.12.2008 0:35
Сообщение #8


Гость






Ты на чем проверяешь программу? В смысле, какой MPI у тебя, и аппаратура какая? Кластер?
 К началу страницы 
+ Ответить 
Neon6868
сообщение 4.12.2008 19:09
Сообщение #9


Пионер
**

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

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


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

Ты на чем проверяешь программу? В смысле, какой MPI у тебя, и аппаратура какая? Кластер?


Да, кластер. А вот какой MPI к сожалению не знаю.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 20.12.2008 0:45
Сообщение #10


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


вопрос еще актуален?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 

- Текстовая версия 17.07.2025 20:14
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"