singlepost

параллельное программирование. MasterSlave. С++ << На главную или назад  

мне надо сделать задачу двумя способами
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;
 }

52 ответов в теме “параллельное программирование. MasterSlave. С++”

  1. 6
    Тимур Магомедов ответил:

    Если бы я давал такое задание, правильное решение было бы примерно таким:

    #include <stdlib.h>
    #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;
    }

  2. 5
    Тимур Магомедов ответил:

    >нет, здесь посылается по несколько – это точно.

    ЩИТО? Все процессы с ненулевым рангом у тебя делают один 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

  3. 4
    Arutyun Mokoyan ответил:

    нет, здесь посылается по несколько – это точно.
    мне сказали чтобы переделать на первый способ надо убрать цикл или циклы. только я не знаю какой из них убрать for и while ? или может оба?

  4. 3
    Тимур Магомедов ответил:

    Я не понял, у тебя же в коде каждый процесс кроме нулевого посылает по одному числу. Это разве уже не "посылалось по одному" ??

    Предполагаю, что ты имел в виду что на принимающем процессе тебе надо вызвать одну функцию MPI для приема всех данных – тогда это MPI_Gather().

  5. 2
    Кирилл Коньшин ответил:

    И если нетрудно скажите как сделать сумму всех положительных??

  6. 1
    Arutyun Mokoyan ответил:

    не подскажете как теперь переделать ее чтобы посылалось по одому???? спасибо за внимание

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.