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

Параллельное программирование openmp (Умножение матрицы на вектор)

22.04.2019, 21:10. Показов 9845. Ответов 2

Author24 — интернет-сервис помощи студентам
Есть задание : написать программу умножения матрицы на вектор. Сравнить время выполнения последовательной и параллельной программы. В итоге время выполнения параллельной части программы в разы больше последовательной.
Не понимаю в чем ошибка. Вот код:

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
105
106
107
108
109
110
111
112
113
114
#include "stdafx.h"
#include <iostream>
#include <omp.h>
#include <thread>
#include <ctime>
using namespace std;
 
void show(int **mas, int n, int m) {
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << mas[i][j] << " ";
        }
        cout << endl;
    }
}
 
 
 
void main() {
    setlocale(LC_ALL, "Russian");
    int m, n;
    cout << "enter n=";
    cin >> n;
    cout << endl;
 
    cout << "enter m=";
    cin >> m;
    cout << endl;
    int **mas;
    mas = new int*[n];
    for (int i = 0; i < n; i++)
        mas[i] = new int[m];
 
    int *vector = new int[m];
 
    int *result = new int[m];
 
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            mas[i][j] = 0 + rand() % 10;
        }
    }
 
    for (int i = 0; i < m; i++)
    {
        vector[i] = 0 + rand() % 10;
        cout << vector[i] << " ";
    }
 
    cout << endl << endl;
 
    show(mas, n, m);
 
    unsigned int start_time = clock();
    for (int i = 0; i < n; i++)
    {
        result[i] = 0;
        for (int j = 0; j < m; j++)
        {
            cout << mas[i][j] << endl;
            result[i] = result[i] + mas[i][j] * vector[j];
        }
    }
 
    unsigned int end_time = clock();
    unsigned int search_time = end_time - start_time;
 
    cout << "TIME="<<search_time << endl;
 
    for (int i = 0; i < n; i++)
    {
        cout << result[i] << " ";
    }
    
    cout << endl << endl;
 
 
    int *result1 = new int[m];
 
 
    unsigned int start_time1 = clock();
 
    omp_set_num_threads(8);
#pragma omp parallel shared(mas,vector, result1)
    {
#pragma omp for schedule (dynamic,1)
            for (int i = 0; i < n; i++)
            {
                result1[i] = 0;
                for (int j = 0; j < m; j++)
                {
                    printf("ID POTOKA=%d\n", this_thread::get_id());
                    printf("Этот поток вычисляет %d строчку\n", i);
                    result1[i] = result1[i] + mas[i][j] * vector[j];
                }
                printf("result1[%d]=%d\n", i, result1[i]);
            }
    }
    
    unsigned int end_time1 = clock();
    unsigned int search_time1 = end_time1 - start_time1;
    
    cout << "ВРЕМЯ ПАРАЛЛЕЛИ=" << search_time1 << endl;
    
    
    
    system("pause");
 
 
 
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2019, 21:10
Ответы с готовыми решениями:

Умножение матрицы на вектор при разделении данных по строкам - <Pthread>
Доброго времени суток, товарищи Будучи студентом 3 курса, завезли нам параллельное...

Умножение матрицы на вектор
Помогите пожалуйста написать программу. Нужно умножить матрирцу(целых чисел) на вектор и вывести...

Умножение матрицы на вектор при разделении данных по строкам (Параллельное программирование)
Здравствуйте, дорогие форумчане! Не поняла тему от слова совсем, очень нужна ваша помощь. Напишите,...

Параллельное программирование openmp
Условия задачи: Написать программу, в которой объявить и присвоить начальные значения целочисленным...

2
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
23.04.2019, 20:39 2
Было больно это читать.

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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <iostream>
#include <omp.h>
#include <thread>
#include <time.h>
 
 
 
 
void show(int **mat, int n, int m) {
 
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            std::cout << mat[i][j] << " ";
        }
        std::cout << '\n';
    }
    std::cout << "\n\n";
}
 
 
void show(int* arr, int size) {
    for (int i = 0; i < size; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << "\n\n";
}
 
 
 
 
int main() {
    setlocale(LC_ALL, "Russian");
 
    int m, n;
    int** matrix;
    int* array_;
    int* result;
 
 
    std::cout << "enter n = ";
    std::cin >> n;
 
    std::cout << "enter m = ";
    std::cin >> m;
    std::cout << '\n';
 
    matrix = new int*[n];
    array_ = new int[m];
    result = new int[m];
 
    for (int i = 0; i < n; ++i) {
        matrix[i] = new int[m];
    }
 
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            matrix[i][j] = rand() % 10;
        }
    }
    //show(matrix, n, m);
 
 
    for (int i = 0; i < m; ++i) {
        array_[i] = rand() % 10;
    }
    //show(array_, m);
 
 
    clock_t timeBegin = clock();
 
    for (int i = 0; i < n; ++i)
    {
        result[i] = 0;
        for (int j = 0; j < m; ++j)
        {
            result[i] += matrix[i][j] * array_[j];
        }
    }
    //show(result, n);
 
    std::cout << "Total ticks 1 = " << clock() - timeBegin << '\n';
 
 
 
 
    omp_set_num_threads(8);
    timeBegin = clock();
 
#pragma omp parallel shared(matrix, array_, result)
    {
#pragma omp for schedule (dynamic)
        for (int i = 0; i < n; ++i) {
            result[i] = 0;
            for (int j = 0; j < m; ++j)
            {
                result[i] += matrix[i][j] * array_[j];
            }
        }
    }
 
    std::cout << "Total ticks 2 = " << clock() - timeBegin << '\n';
 
 
 
    delete[] matrix;
    delete[] array_;
    delete[] result;
 
    system("pause");
    return 0;
}
 
 
 
/* output
enter n = 1000
enter m = 2000
 
Total ticks 1 = 12
Total ticks 2 = 8
 
*/
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
29.04.2019, 09:38 3
Я ошибся с удалением матрицы. Должно быть что-то вроде этого:
C++
1
2
3
4
    for (int i = 0; i < n; ++i) {
        delete[] matrix[i];
    }
    delete[] matrix;
0
29.04.2019, 09:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.04.2019, 09:38
Помогаю со студенческими работами здесь

Реализовать умножение матрицы на матрицу и матрицы на вектор
Доброй ночи форумчане,не знаю куда податься уже, я полный ноль в программировании, но дали задание...

Умножение матрицы на вектор
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; typedef matrix;...

Умножение матрицы на вектор
...вопрос, чем будет отлтичатся умножение матрицы на вектор с числами и с тригонометрическими...

Умножение матрицы на вектор
Нужна помощь, ребята! Вот код программы, выбивает 2 ошибки: 1- значение А должны быть...


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

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