Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу MPI_Send MPI_Recv Передача массива
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Skeyna Skeyna вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.10.2018
По умолчанию MPI_Send MPI_Recv Передача массива - 23.10.2018, 18:44

Нужно найти сумму двух векторов.

Я поняла как передать в сообщении один элемент, но мне надо передать весь массив, помогите пожалуйста что не так и как сделать(
Если беру размерность 10 и 2 процесса, то выводит только 5 элементов

cpp Код:
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <mpi.h>
#include <ctime>
#define ARRAY_SIZE 20

using namespace std;

int main(int argc, char* argv[])
{
    double time_start=0, time_end, TIME;
    int size=0, rank=0;
    int *vec1, *vec2,*vec3;
    const double size1 = ARRAY_SIZE;
    MPI_Status status;

    /* Инициализируем библиотеку */
    MPI_Init(&argc, &argv);
    /* Узнаем количество задач в запущенном приложении */
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    /* ... и свой собственный номер: от 0 до (size -1) */
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);


    //mid - среднее число элементов, которые будет сосздавать массив
    //size - целая часть
    //ost - дробная часть
    double mid = size1 / size;//кол-во элементов на кол-во процессов
    double size_for_procces = 0;
    //целая часть уходит в size_for_procces
    float ost = modf(mid, &size_for_procces);
    int dop = 0;

//-------------------//
//заполнение векторов
    if (rank)
    {
        vec1 = new int[(int)size_for_procces];
        vec2 = new int[(int)size_for_procces];
        for (int i = 0; i < size_for_procces; i++)
        {
            vec1[i] = rand() % 10 + 1;
            vec2[i] = rand() % 10 + 1;
        }
    }
    else
    {
        if (ost > 0)  //генерация недостающих элементов "главным процессом"
            dop = round(ost*size);

        vec1 = new int[(int)size_for_procces + dop];
        vec2 = new int[(int)size_for_procces + dop];
        for (int i = 0; i < size_for_procces + dop; i++)
        {
            vec1[i] = rand() % 10 + 1;
            vec2[i] = rand() % 10 + 1;

        //  cout << vec1[i]<< ' '<<' ';
        }
       
        for (int i = 0; i < size_for_procces + dop; i++)
        {
            cout << vec1[i] << ' ' << ' ';
        }
        cout << endl;
        for (int i = 0; i < size_for_procces + dop; i++)
        {
            cout << vec2[i] << ' '<<' ';
        }
    }
//-------------------//
    //измерение времени
    if (rank == 0)
        time_start = MPI_Wtime();
//-------------------//
    //поиск суммы векторов
    vec3= new int[(int)size_for_procces + dop];
    if (rank == 0)
    {
        for (int i = 0; i < size_for_procces + dop; i++)
            vec3[i] = vec1[i] + vec2[i];
            }
    else
    {
        for (int i = 0; i < size_for_procces; i++)
       
            vec3[i] = vec1[i] + vec2[i];
       
    //  for (int i = 0; i < size_for_procces; i++)
            //MPI_Send(&vec3[i], size_for_procces-1, MPI_INT, 0, 2, MPI_COMM_WORLD);
            MPI_Send(&vec3[0], 1, MPI_INT, 0, 2, MPI_COMM_WORLD);
       
    }
//-------------------//
    cout << endl;
   
   
    if (rank == 0)
    {
        int *n_vec = new int[size];
        n_vec[0] = vec3[0];
    /*  int *arr;

        arr = new int[size1];
        for (int i = 1; i < size1; i++)
            MPI_Recv(arr, size1, MPI_INT, i, 2, MPI_COMM_WORLD, &status);*/


        for (int i = 1; i < size; i++)
            MPI_Recv(&vec3[i], size, MPI_INT, i, 2, MPI_COMM_WORLD, &status);

        for (int i = 1; i < size; i++)
        {
            n_vec[i] = vec1[i] + vec2[i];
            vec3[i] = n_vec[i];
        }
        time_end = MPI_Wtime();
        TIME = (time_end - time_start);
        for (int i = 0; i < size_for_procces; i++)
        cout << vec3[i] << ' '<<' ';

        cout << "\n TIME: " << TIME * 1000 << " milliseconds" << endl;
        std::cout << "Processes: " << size << '\n';
        delete[] n_vec;
    }
   
    delete[] vec1;
    delete[] vec2;
    delete[] vec3;
    MPI_Finalize();
    return 0;
}
Ответить с цитированием
  (#2 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,281
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 24.10.2018, 13:36

Цитата:
Сообщение от Skeyna Посмотреть сообщение
Я поняла как передать в сообщении один элемент, но мне надо передать весь массив
В чём проблема? Второй параметр MPI_Send() и MPI_Recv() - количество передаваемых элементов
Ответить с цитированием
  (#3 (permalink)) Старый
Skeyna Skeyna вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.10.2018
По умолчанию 24.10.2018, 17:54

Цитата:
Сообщение от Alexiski Посмотреть сообщение
В чём проблема? Второй параметр MPI_Send() и MPI_Recv() - количество передаваемых элементов
Да, я понимаю это, делаю и не рабоает
Ответить с цитированием
  (#4 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,281
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 25.10.2018, 00:01

Что именно не работает? Покажите код и ошибки
Ответить с цитированием
  (#5 (permalink)) Старый
Skeyna Skeyna вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.10.2018
По умолчанию 28.10.2018, 13:28

Цитата:
Сообщение от Alexiski Посмотреть сообщение
Что именно не работает? Покажите код и ошибки
Никакой ошибки не выходило, просто при запуске с n=20 с 2 процессами, например, в итоге выводился результат для n=10, просто был кратен n/процессы.
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача двумерного массива в функцию Gueteoche С/С++ 1 15.09.2014 19:42
передача одномерного массива как параметра функции Neon_325 Любые вопросы от новичков 3 01.04.2012 18:41
Передача динамического массива как аргумент _Лют_ С/С++ 1 01.01.2012 19:22
Передача массива из потока в поток и организация программы kvkoz C++ Builder 0 16.10.2011 18:55
Передача массива в функцию на Pascal rotmaister Pascal 6 23.04.2010 11:43
Передача массива в функцию alexu C++ Builder 8 02.09.2009 02:44
Передача двумерного массива в функцию Spegulo Вопросы начинающих программистов 4 20.06.2008 04:03
ввод массива и вывод массива obxcc Pascal 3 10.11.2007 12:25
C#. Передача массива СОМ интерфейсу принимающему ссылку ALEX_KS .NET 0 18.05.2006 21:00
Передача массива строк BSTR через COM-объект MishaPMPU Вопросы начинающих программистов 3 06.12.2005 20:17
Передача массива значений в MS Excel не используя MFC Sergey Sakhno Visual C++ 0 01.11.2005 09:48
Передача массива с сервера на клиент Anonymous ASP 0 28.07.2003 12:45



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов