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

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

Войти
Регистрация
Восстановить пароль
 
Heisenberg
44 / 45 / 3
Регистрация: 11.08.2010
Сообщений: 226
08.03.2014, 14:32     Оптимизация умножения матриц 4x4 #1
Есть код - умножение двух матриц размером 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];
    }
}
Функция используется очень часто, помогите оптимизировать ее, в профилировщике в каждой функции где она используется она больше всех использует времени на выполнение, если верить профилировщику
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2014, 14:32     Оптимизация умножения матриц 4x4
Посмотрите здесь:

C++ Алгоритм умножения прямоугольных матриц
Рекурсивная процедура умножения матриц C++
непонятное явление при перегрузке умножения в классе матриц C++
Подпрограмма умножения 2 матриц C++
C++ Реализовать функции сложения, вычитания и умножения матриц
C++ Написать функцию умножения матриц
C++ Оптимизации алгоритма умножения квадратных матриц
C++ Функция умножения матриц
C++ Исправить программу для умножения матриц
Оптимизация алгоритма перемножения двух матриц C++
Создать класс Matrix и функции умножения и сложения матриц C++
C++ Скорость умножения матриц

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
6056 / 5659 / 1829
Регистрация: 18.12.2011
Сообщений: 14,455
Завершенные тесты: 1
08.03.2014, 14:45     Оптимизация умножения матриц 4x4 #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;
        }
    }
 
}
monochromer
 Аватар для monochromer
378 / 346 / 133
Регистрация: 03.01.2013
Сообщений: 906
08.03.2014, 15:00     Оптимизация умножения матриц 4x4 #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}
ValeryS
Модератор
6413 / 4879 / 448
Регистрация: 14.02.2011
Сообщений: 16,180
08.03.2014, 15:08     Оптимизация умножения матриц 4x4 #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];
VTsaregorodtsev
303 / 283 / 38
Регистрация: 19.02.2010
Сообщений: 1,231
09.03.2014, 21:38     Оптимизация умножения матриц 4x4 #5
Heisenberg, по размеру матрицы - всё заточено под векторизацию (SSE-команды).
В мат.библиотеках (BLAS или интеловская MKL) однозначно должны быть специально написанные быстрые функции под такой размер матриц.
Но векторизация требует предварительного транспонирования второй матрицы. И тут надо смотреть весь остальной код - лучше сделать так, чтобы эта вторая матрица была постоянной или очень редко изменяемой (чтобы транспонировать не при каждом умножении - а только один раз или малое число раз).
Yandex
Объявления
09.03.2014, 21:38     Оптимизация умножения матриц 4x4
Ответ Создать тему
Опции темы

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