![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Neon6868 |
![]()
Сообщение
#1
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 146 Пол: Мужской Репутация: ![]() ![]() ![]() |
Необходимо написать программу на 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();
}
|
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Хм... А кто синхронизировать будет?
Навскидку (проверять, естественно, сейчас негде) - MPI_Barrier(MPI_COMM_WORLD); // Как минимум не хватает...
MPI_Reduce(&sum,&otvet,1,MPI_FLOAT,MPI_SUM,0,MPI_COMM_WORLD);
+ вывод результата сделай в корневом процессе, а не во всех подряд... |
Neon6868 |
![]()
Сообщение
#3
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 146 Пол: Мужской Репутация: ![]() ![]() ![]() |
Хм... А кто синхронизировать будет? Навскидку (проверять, естественно, сейчас негде) - 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 ? |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата В функции MPI_Reduce для операции MPI_SUM передаваемые операнды должны быть MPI типа Это ты с чего взял? Прекрасно MPI_Reduce работает и с float и с double. |
Neon6868 |
![]()
Сообщение
#5
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 146 Пол: Мужской Репутация: ![]() ![]() ![]() |
Это ты с чего взял? Прекрасно MPI_Reduce работает и с float и с double. Я на сайте http://skif.bas-net.by/bsuir/mpi-1-std/node81.html прочитал "Предопределенные операции работают только с типами MPI , описанными в разделах 4.9.2 и 4.9.3." Это не верно? Тогда моя программа неправильно работает только из-за того, что я не сделал синхронизацию? |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
А сами таблицы, на которые ссылаются на том сайте, видел? Вот они, причем в оригинале:
manpagez: man MPI_Reduce(3)... А вот цитата оттуда: Now, the valid datatypes for each option is specified below. Цитата Тогда моя программа неправильно работает только из-за того, что я не сделал синхронизацию? Ничего себе "только". Ты ж сам говоришь, что все процессы по отдельности считают площади... А вместе-не собирается... Чего не хватает по-твоему? |
Neon6868 |
![]()
Сообщение
#7
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 146 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ничего себе "только". Ты ж сам говоришь, что все процессы по отдельности считают площади... А вместе-не собирается... Чего не хватает по-твоему? Я думаю, что с помощью MPI_Reduce все эти площади и должны суммироваться в одну переменную. Или еще чего-то не хватает, кроме синхронизации? |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Ты на чем проверяешь программу? В смысле, какой MPI у тебя, и аппаратура какая? Кластер?
|
Neon6868 |
![]()
Сообщение
#9
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 146 Пол: Мужской Репутация: ![]() ![]() ![]() |
|
мисс_граффити |
![]()
Сообщение
#10
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
вопрос еще актуален?
-------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
![]() ![]() |
![]() |
Текстовая версия | 17.07.2025 20:14 |