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

Векторизация

20.05.2022, 21:59. Показов 467. Ответов 3
Метки c++ (Все метки)

Author24 — интернет-сервис помощи студентам
Есть программа, которая задает 3 квадратную матрицу путем умножения 2-х других квадратных матриц. Задача использовать векторизацию для помощи компилятору в его вычислениях. Как это можно реализовать?
C++ (Qt)
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
#include <iostream>
#include <math.h>
using namespace std;
 
int main()
{
    const int N = 2;
 
    int M1[N][N];
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            M1[i][j] = rand() % 10;
        }
    }
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cout << M1[i][j] << "\t";
        }
        cout << endl;
    }
    cout << endl;
 
    int M2[N][N];
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            M2[i][j] = rand() % 10;
        }
    }
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cout << M2[i][j] << "\t";
        }
        cout << endl;
    }
    cout << endl;
 
    int M3[N][N];
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            M3[i][j] = 0;
            for (int k = 0; k < N; k++)
            {
                M3[i][j] += M1[i][k] * M2[k][j];
            }
        }
    }
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cout << M3[i][j] << "\t";
        }
        cout << endl;
    }
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.05.2022, 21:59
Ответы с готовыми решениями:

Векторизация кода
Задание: Написать программу с ручной векторизацией (выбрать любой вариант из возможных трех:...

Векторизация вычислений
Сравниваю скорость перемножения двух векторовvalarray и последующего присвоения третьему вектору,...

Как производится векторизация BITMAP?
Народ поможите! Как производится векторизация BITMAP и тому подобное.

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

3
34 / 22 / 13
Регистрация: 20.05.2022
Сообщений: 403
20.05.2022, 23:14 2
Vaarga, вместо int М[2][3], пишешь vector <vector<int>> m; не сразу понял вопрос, я думал переписать с использованием векторов. В спойлеров ссылка по векторизации. Там вполне развёрнутый вопрос. Если что непонятно, спрашивай

Кликните здесь для просмотра всего текста
0
0 / 0 / 0
Регистрация: 06.05.2022
Сообщений: 11
24.05.2022, 21:38  [ТС] 3
Я прочитал статейку, но так и не понял как это грамотно реализовать в коде. Даже примеры не дали конкретной ясности. Дополнительно также обратился к этому видео ролику: https://youtu.be/x9Scb5Mku1g , и кое-что перенял оттуда, но тем не менее на этапе реализации всего этого в моем коде я получил кучу ошибок (видимо я все очень плохо понял).
C++ (Qt)
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
#include <iostream>
#include <math.h>
#include <thread>
#include <immintrin.h>
using namespace std;
 
int main()
{
    const int N = 5;
 
    __m256d _M1, _M2, _M3;
 
    int M1[N][N];
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            M1[i][j] = rand() % 10;
 
            __m256d m1 = _mm256_loadu_pd(&M1[i][j]);
        }
    }
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cout << M1[i][j] << "\t";
        }
        cout << endl;
    }
    cout << endl;
 
    int M2[N][N];
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            M2[i][j] = rand() % 10;
 
            __m256d m2 = _mm256_loadu_pd(&M2[i][j]);
        }
    }
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cout << M2[i][j] << "\t";
        }
        cout << endl;
    }
    cout << endl;
 
    int M3[N][N];
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            M3[i][j] = 0;
            for (int k = 0; k < N; k++)
            {
                //M3[i][j] += M1[i][k] * M2[k][j];
 
                __m256d m3 = _mm256_mul_pd(m1, m2);
            }
        }
    }
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cout << M3[i][j] << "\t";
        }
        cout << endl;
    }
 
    return 0;
}
Ошибки:
E0167 аргумент типа "int *" несовместим с параметром типа "const double *" MatrixVec строка: 20
E0167 аргумент типа "int *" несовместим с параметром типа "const double *" MatrixVec строка: 40
E0020 идентификатор "m1" не определен MatrixVec строка: 63
E0020 идентификатор "m2" не определен MatrixVec строка: 63

C4700 использована неинициализированная локальная переменная "_M2" MatrixVec строка: 57
C4700 использована неинициализированная локальная переменная "_M1" MatrixVec строка: 57

И 2 предупреждения:
C6001 Использование неинициализированной памяти "_M1". MatrixVec строка: 57
C6001 Использование неинициализированной памяти "_M2". MatrixVec строка: 57

Вероятно ошибки очень глупые, но мне они совсем не очевидны.
0
1487 / 1414 / 240
Регистрация: 19.02.2010
Сообщений: 3,915
25.05.2022, 01:35 4
Цитата Сообщение от Vaarga Посмотреть сообщение
Вероятно ошибки очень глупые, но мне они совсем не очевидны.
Ты в код пихаешь ассемблерные команды (ну, или интринсики в данном случае), предназначенные для работы с упакованными double-величинами. А у матрицы - целочисленный тип данных. Обычное несоответствие типов (это что касается первых двух ошибок).

А ошибки для строки 63 - потому, что переменные m1, m2 ранее были объявлены внутри тушек циклов (и область видимости у них поэтому оказалась ограничена тушками циклов).
Ну и интринсик в строке 63 тоже надо будет поправить на соответствующий перемножению целочисленных данных.


PS. Не верю, что справишься. Ибо при размерах матрицы, некратных числу укладываемых в векторный регистр данных (а при 5*5 это именно так) - придётся к векторным вычислениям добавлять ещё и скалярную "добивку" некратных "хвостов". Т.е. если "хвосты" считать тоже на ассемблере/интринсиках - то в 2 раза больше работы выходит по изучению нового. Бросай это дело
0
25.05.2022, 01:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2022, 01:35
Помогаю со студенческими работами здесь

Векторизация
x=1:10; y=2:11; z=10:-1:1; z(x:y) ans = 10 9

НЕ работает ВЕКТОРИЗАЦИЯ
Не работает векторизация. В чем ошибка ??? задаем масивы: x=; n=ones(28,1); v=1:28;...

Векторизация цикла
Написал медианный фильтр для маски размером 3 на 3. Но время выполнения 7.4 секунд. Никак не могу...

Векторизация массива в numpy
Есть массив numpy, который содержит номера классов 1,2,3 необходимо представить эти классы в...

Векторизация массива numpy
Есть массив numpy, который содержит номера классов 1,2,3 необходимо представить эти классы в...

Векторизация растровых контуров
Есть растр, в нем на белом фоне нарисованы произвольно границы трех непересекающихся областей....

Векторизация множественно выполняющейся операции
Задача - произвести какую либо операцию над каждым элементом массива. К примеру возьмем 2 числовых...


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

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