мне надо сделать задачу двумя способами
1 – это когла посылается по одному
2 – когда посылается по несколько
Поиск максимума из отрицательных элементов
вот я сделал второй способ когда посылается по несколько
#include <mpi.h>
#include <stdio.h>
#include <string.h>
#define TAG 0
int main(int argc,char*argv[])
{
MPI_Init(&argc,&argv); // подключение к MPI
int temp;
int myrank;
int s;
MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD,&myrank);
MPI_Comm_size(MPI_COMM_WORLD, &s);
if(myrank==0)
{
bool found = false;
int i = 1;
int max;
while (!found && i < s)
{
MPI_Recv(&temp,1,MPI_INT,i,TAG,MPI_COMM_WORLD,&status);
printf("received:%d\n",temp);
found = temp < 0;
i++;
}
if (found)
{
max = temp;
for (; i<s; i++)
{
MPI_Recv(&temp,1,MPI_INT,i,TAG,MPI_COMM_WORLD,&status);
printf("%d received:%d\n",myrank, temp);
if (temp < 0 && temp > max)
max = temp;
}
printf("Max value is :%d\n",max);
}
else
printf ("max not found\n");
}
else
{
int val;
if (myrank % 2==0)
{
val=myrank;
}
else val=-myrank;
printf("%d sended: %d\n", myrank, val);
MPI_Send(&val,1,MPI_INT,0,TAG,MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
#include <stdio.h>
#include <string.h>
#define TAG 0
int main(int argc,char*argv[])
{
MPI_Init(&argc,&argv); // подключение к MPI
int temp;
int myrank;
int s;
MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD,&myrank);
MPI_Comm_size(MPI_COMM_WORLD, &s);
if(myrank==0)
{
bool found = false;
int i = 1;
int max;
while (!found && i < s)
{
MPI_Recv(&temp,1,MPI_INT,i,TAG,MPI_COMM_WORLD,&status);
printf("received:%d\n",temp);
found = temp < 0;
i++;
}
if (found)
{
max = temp;
for (; i<s; i++)
{
MPI_Recv(&temp,1,MPI_INT,i,TAG,MPI_COMM_WORLD,&status);
printf("%d received:%d\n",myrank, temp);
if (temp < 0 && temp > max)
max = temp;
}
printf("Max value is :%d\n",max);
}
else
printf ("max not found\n");
}
else
{
int val;
if (myrank % 2==0)
{
val=myrank;
}
else val=-myrank;
printf("%d sended: %d\n", myrank, val);
MPI_Send(&val,1,MPI_INT,0,TAG,MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
21 марта 2010 в 1:05
Если бы я давал такое задание, правильное решение было бы примерно таким:
#include <stdio.h>
#include <mpi.h>
void min_negative_function(int *in, int *out, int *len, MPI_Datatype * dptr)
{
int i;
for (i = 0; i < *len; i++) {
if (*out > 0) {
*out = *in;
} else if ((*in < 0) && (*in > *out)) {
*out = *in;
}
in++;
}
}
int main(int argc, char **argv)
{
MPI_Op min_neg;
int rank, size;
int val;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Op_create((MPI_User_function *) min_negative_function, 1, &min_neg);
val = rank % 2 == 0 ? rank : -rank;
MPI_Reduce(&val, &val, 1, MPI_INT, min_neg, 0, MPI_COMM_WORLD);
if (rank == 0) {
if (val >= 0) {
printf("No negative values\n");
} else {
printf("Maximum negative value is %d\n", val);
}
}
MPI_Op_free(&min_neg);
MPI_Finalize();
return EXIT_SUCCESS;
}
21 марта 2010 в 0:02
>нет, здесь посылается по несколько – это точно.
ЩИТО? Все процессы с ненулевым рангом у тебя делают один MPI_Send(&val, 1, MPI_INT, 0, TAG, MPI_COMM_WORLD);.
Как я предполагаю, от тебя хотят следующее:
Убери все for и while в начале, убери все MPI_Send и MPI_Recv, получи данные от всех процессов с помощью MPI_Gather() – ты получишь в процессе с рангом 0 массив с числами от всех остальных процессов. Дальше просто в этом массиве найдешь минимум среди отрицательных элементов. У Кирилла Коньшина – то же самое, только положительных. Минимум среди отрицательных элементов в массиве найдете? =)
Возможно ещё, от вас хотят чтобы вы использовали MPI_Op_create() и MPI_Reduce() (по аналогии с MPI_Reduce() с MIN), но это уж слишком сложно, судя по уровню вопросов.
PS есть специализированная группа по параллельному программированию – //vkontakte.ru/club795328
20 марта 2010 в 23:05
нет, здесь посылается по несколько – это точно.
мне сказали чтобы переделать на первый способ надо убрать цикл или циклы. только я не знаю какой из них убрать for и while ? или может оба?
20 марта 2010 в 23:02
Я не понял, у тебя же в коде каждый процесс кроме нулевого посылает по одному числу. Это разве уже не "посылалось по одному" ??
Предполагаю, что ты имел в виду что на принимающем процессе тебе надо вызвать одну функцию MPI для приема всех данных – тогда это MPI_Gather().
20 марта 2010 в 0:02
И если нетрудно скажите как сделать сумму всех положительных??
19 марта 2010 в 23:05
не подскажете как теперь переделать ее чтобы посылалось по одому???? спасибо за внимание