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

Умножение матриц - C++

Восстановить пароль Регистрация
 
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 24.02.2011
Сообщений: 126
18.11.2011, 14:20     Умножение матриц #1
Есть 2 функции перемножения квадратных матриц N*N
вторая функция транспонирует вторую матрицу для того, чтобы перемножение шло строка на строку, для более эффективного использования кэша, только почему то работает намного медленнее первой, в чем может быть проблема? само транспонирование выполняется мгновенно, проверял на матрицах с размерностью 100-1000 элементов
C++
1
2
3
4
5
6
7
8
9
10
void mul(float* a,float* b,float* c)
{
    for (int i=0;i<N;i++)
            for (int k=0;k<N;k++)
            {
                float val=a[i*N+k];
                for (int j=0;j<N;j++)
                    c[i*N+j]+=val*b[k*N+j];
            }
}


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void transpose(float* A)
{
    for (int i=0;i<N;i++)
        for (int j=i+1;j<N;j++)
                {
                       float t; t=A[i*N+j]; A[i*N+j]=A[j*N+i]; A[j*N+i]=t;
                }
}
void mul_trans(float* a,float* b,float* c)
{
    transpose(b);
    for (int i=0;i<N;i++)
            for (int j=0;j<N;j++)
            {
                float val=0;
                for (int k=0;k<N;k++)
                    val+=a[i*N+k]*b[j*N+k];
                c[i*N+j]=val;
            }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2011, 14:20     Умножение матриц
Посмотрите здесь:

C++ Умножение матриц
Умножение матриц C++
C++ Умножение матриц
C++ умножение матриц
C++ Умножение матриц
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DenCHS200
 Аватар для DenCHS200
32 / 32 / 1
Регистрация: 07.10.2011
Сообщений: 117
18.11.2011, 14:41     Умножение матриц #2
Можно немного оптимизировать: не обявлять переменную t в цикле, а обьявить до цикла
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 24.02.2011
Сообщений: 126
18.11.2011, 15:04  [ТС]     Умножение матриц #3
Цитата Сообщение от DenCHS200 Посмотреть сообщение
Можно немного оптимизировать: не обявлять переменную t в цикле, а обьявить до цикла
это мелочи, транспонирование меньше 1% всего времени занимает
DenCHS200
 Аватар для DenCHS200
32 / 32 / 1
Регистрация: 07.10.2011
Сообщений: 117
18.11.2011, 15:07     Умножение матриц #4
Если ты скорость работы с какой-нибудь готовой функцией сравниваешь, то , скорее всего ,её с помощью ассемблера писали, например в DirectX такие функции есть, так как графика в играх очень часто на матрицах базируется.Может тогда ассемблерную часть кода врезать в листинг?Хотя может и бредовая это идея моя?
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 24.02.2011
Сообщений: 126
18.11.2011, 15:10  [ТС]     Умножение матриц #5
Цитата Сообщение от DenCHS200 Посмотреть сообщение
Если ты скорость работы с какой-нибудь готовой функцией сравниваешь, то , скорее всего ,её с помощью ассемблера писали, например в DirectX такие функции есть, так как графика в играх очень часто на матрицах базируется.Может тогда ассемблерную часть кода врезать в листинг?Хотя может и бредовая это идея моя?
я привел листинги двух функций, первая 3 обычных вложенных циклов, только с правильным порядком переменных(чтобы осуществлялся проход по строке, а не по столбцу для второй матрицы), во втором листинге осуществляется проход по строкам сразу двух матриц , т.к. 2-ая матрица транспонированная, что должно работать быстрее первого варианта, но работает медленнее, я хочу понять почему
Yandex
Объявления
18.11.2011, 15:10     Умножение матриц
Ответ Создать тему
Опции темы

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