Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Heisenberg
44 / 45 / 3
Регистрация: 11.08.2010
Сообщений: 226
#1

Оптимизация умножения матриц 4x4 - C++

08.03.2014, 14:32. Просмотров 1114. Ответов 4
Метки нет (Все метки)

Есть код - умножение двух матриц размером 4x4

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void mat_multiply(float *matrix, float *a, float *b)
{
    float result[16];
    for (int c = 0; c < 4; c++)
    {
        for (int r = 0; r < 4; r++)
        {
            int index = c * 4 + r;
            float total = 0;
            for (int i = 0; i < 4; i++)
            {
                int p = i * 4 + r;
                int q = c * 4 + i;
                total += a[p] * b[q];
            }
            result[index] = total;
        }
    }
    for (int i = 0; i < 16; i++)
    {
        matrix[i] = result[i];
    }
}
Функция используется очень часто, помогите оптимизировать ее, в профилировщике в каждой функции где она используется она больше всех использует времени на выполнение, если верить профилировщику
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2014, 14:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оптимизация умножения матриц 4x4 (C++):

Скорость умножения матриц - C++
Всем привет. Решил написать 2 метода умножения матриц, и проверить скорость их выполнения. Имеем класс Mat4 в котором данные описаны...

Подпрограмма умножения 2 матриц - C++
#include&lt;iostream.h&gt; const int N=20;const int M=25; double m,l,n; void d(double x,double y,double z) void main () { int i,j; ...

Функция умножения матриц - C++
Так получилось , что я решила перейти в другой вуз на другую специальность. Программирование - это не мое . Но нужно сдать сессию , а на...

Рекурсивная процедура умножения матриц - C++
Вот мне задали написать рекурсивную процедуру для умножения матриц. Я понимаю, что значит написать процедуру умножения матриц, но что...

Проверить результат умножения матриц - C++
Здравствуйте! Снова решил сдать задачу на сайте Дистанционная подготовка. Но программа не проходит по времени. Помогите, пожалуйста,...

Написать функцию умножения матриц - C++
Условие : даны 3 матрицы . Определить функцию которая перемножит 2 матрицы. С помощью неё произвести умножение трех данных матриц. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6380 / 5945 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
08.03.2014, 14:45 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void mat_multiply(float *matrix, float *a, float *b)
{
    for (int c = 0; c < 4; c++)
    {
         int index=c*4;
        for (int r = 0; r < 4; r++)
        {
             float total = 0;
             int q=c*4,p=r;
             for (int i = 0; i < 4; i++)
             {
                total += a[p] * b[q++];
                p+=i*4;
             }
             matrix[index++] = total;
        }
    }
 
}
1
monochromer
404 / 366 / 144
Регистрация: 03.01.2013
Сообщений: 961
08.03.2014, 15:00 #3
Можно, конечно, пойти на крайние меры и вычислять элементы матрицы так (раз уж размер матрицы жестко задан):
http://www.cyberforum.ru/cgi-bin/latex.cgi?M_{11} = A_{11} B_{11} + A_{12} B_{21} + A_{13} B_{31} + A_{14} B_{41}
0
ValeryS
Модератор
6631 / 5039 / 466
Регистрация: 14.02.2011
Сообщений: 16,845
08.03.2014, 15:08 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Heisenberg Посмотреть сообщение
C++
1
2
3
4
5
6
for (int i = 0; i < 4; i++)
            {
                int p = i * 4 + r;
                int q = c * 4 + i;
                total += a[p] * b[q];
            }
например развернуть вот этот цикл
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int p,q
 
  p=r;
  q=c*4; 
 total += a[p] * b[q];
  p+=4;
  q++;
 total += a[p] * b[q];
  p+=4;
  q++;
 total += a[p] * b[q];
  p+=4;
  q++;
 total += a[p] * b[q];
0
VTsaregorodtsev
353 / 334 / 48
Регистрация: 19.02.2010
Сообщений: 1,414
09.03.2014, 21:38 #5
Heisenberg, по размеру матрицы - всё заточено под векторизацию (SSE-команды).
В мат.библиотеках (BLAS или интеловская MKL) однозначно должны быть специально написанные быстрые функции под такой размер матриц.
Но векторизация требует предварительного транспонирования второй матрицы. И тут надо смотреть весь остальной код - лучше сделать так, чтобы эта вторая матрица была постоянной или очень редко изменяемой (чтобы транспонировать не при каждом умножении - а только один раз или малое число раз).
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2014, 21:38
Привет! Вот еще темы с ответами:

Алгоритм умножения прямоугольных матриц - C++
написать алгоритм умножения прямоугольных матриц, известна только размерность

Исправить программу для умножения матриц - C++
Привет. Создал программу для умножения матриц, используя метод Виноград. Вот что получилось #include &lt;iostream&gt; #include &lt;math.h&gt; using...

Алгоритм умножения матриц Винограда-Штрассена - C++
Имеется реализованный алгоритм умножения матриц по Штрассену. Проблема следующая: Штрассена надо переделать в Штрассена-Винограда, но это...

Оптимизации алгоритма умножения квадратных матриц - C++
Какой алгоритм используется в мат. пакете Матлаб для умножения квадратных матриц? Даже не сам алгоритм, а идея или хотя бы догадки. ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.03.2014, 21:38
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru