Форум программистов, компьютерный форум, киберфорум
MPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 03.12.2016
Сообщений: 83
1

Параллельное программирование mpi

17.10.2018, 22:57. Показов 2053. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Разработать параллельную версию программы без использования коллективных коммуникаций. Операции "точка-точка"
Найти сумму двух векторов.

Реализовал свою задумку, но где-то накосячил, корректно работает только при 1 процессе, может кто поможет найти ошибку, пожалуйста, буду благодарен!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <mpi.h>
#include <ctime>
#define ARRAY_SIZE 10
 
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);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
 
    double mid = size1 / size;//кол-во элементов на кол-во процессов
    double size_for_procces = 0;
    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]<< ' '<<' ';
        }
        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];
 
            MPI_Send(&vec3[i], 1, MPI_INT, 0, 2, MPI_COMM_WORLD);
        }
    }
    cout << endl;
    if (rank == 0)
    {
        int *n_vec = new int[size];
        n_vec[0] = vec3[1];
 
        for (int i = 1; i < size; i++)
            MPI_Recv(&n_vec[i], 1, MPI_INT, i, 2, MPI_COMM_WORLD, &status);
 
        for (int i = 1; i < size; i++)
        {
            vec3[i] = vec1[i] + vec2[i];
        //out << vec3[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;
        delete[] n_vec;
    }
    delete[] vec1;
    delete[] vec2;
    delete[] vec3;
    MPI_Finalize();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.10.2018, 22:57
Ответы с готовыми решениями:

Параллельное пограммирование MPI (Game of Life )
Как написать данный код с помощью MPI? #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include...

Параллельное программирование в С++
Здравствуйте! я новичок в параллельном программировании. Помогите пожалуйста с задачкой!! Есть одна...

параллельное программирование
Клиент серверное приложение. Суть - в реализации обычного чата. Оба устройства коннекятся через...

параллельное программирование
Подскажите, пожалуйста! Возвожу положительные числа в степень, а выдается отрицательный результат....

1
0 / 0 / 1
Регистрация: 03.12.2016
Сообщений: 83
23.10.2018, 18:02  [ТС] 2
Вопрос еще актуален
0
23.10.2018, 18:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2018, 18:02
Помогаю со студенческими работами здесь

Параллельное программирование
У меня есть задание: Коллективные операции. Работа имитирует реальный поиск в параллельной базе...

Параллельное программирование
Подскажите, пожалуйста, как в PUTTY начать редактировать файл?

Параллельное программирование
Как составить параллельную программу вычисления среднего арифметического элементов вектора?

Параллельное программирование
Всем доброго времени суток! Не нашла на сайте ни одной темы с параллельным программированием....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru