2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5  След.
 
 Re: Перемножение матриц в С++
Сообщение14.06.2017, 20:42 
Заслуженный участник


27/04/09
28128
Давайте всё-таки использовать [syntax lang="cpp"]…[/syntax] или там [syntax lang="c"]…[/syntax], раз уж они есть.

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение14.06.2017, 20:56 


07/10/15

2400
хорошо!

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение14.06.2017, 21:02 
Заслуженный участник
Аватара пользователя


16/07/14
8434
Цюрих

(Оффтоп)

Dmitriy40 в сообщении #1225404 писал(а):
скорость работы с памятью считаем уже оптимизированной и не тормозящей процесс
На практике перемножение матриц в несколько потоков упирается в чтение из памяти обычно.

Andrey_Kireew в сообщении #1225408 писал(а):
кстати экспонента алгоритма перемножения matlab примерно 2.69, это лучше, чем алгоритм Штрассена
А как вы это меряете? Чтобы поймать разницу в $0.04$ надо в показателе надо мерять очень аккуратно (и на больших матрицах, чтобы перестало быть важным, какая доля влезает в кеш какого уровня)
Andrey_Kireew в сообщении #1225475 писал(а):
теперь цикл выполняется за 1.5 секунды
А какое железо? (главное - какие SIMD инструкции поддерживает процессор)
Вы же с оптимизацией собираете? (просто полторы секунды - это всё равно очень много; либо железо старое, либо что-то не так)

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение14.06.2017, 21:24 


07/10/15

2400
Я посчитал время для матрицы 10000x10000 получилось 46.5 секунд кажется, ну и из пропорции
$46.5\cdot 1000^x=0.1$\cdot 10000^x
$x=log_{10}{465}$ (это по памяти, может быть не совсем точно, те расчёты я не сохранил)

я проверяю на ноте i5-3317u (2 ядра, 2.4 ГГц в режиме турбо), но не суть важно, есть железо и по мощнее, просто это самый трудоёмкий фрагмент всей моей программы, причём он далеко не первостепенной важности, т.е. не вписывается он в приложение так как есть, его или оптимизировать, или убирать вообще

но 1.5 секунды это уже терпимо, попробую ещё оптимизировать по Штрассену и уменьшить общее количество циклов

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение14.06.2017, 21:36 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Andrey_Kireew в сообщении #1225503 писал(а):
Я посчитал время для матрицы 10000x10000 получилось 46.5 секунд кажется, ну и из пропорции
$46.5\cdot 1000^x=0.1$\cdot 10000^x
$x=log_{10}{465}$ (это по памяти, может быть не совсем точно, те расчёты я не сохранил)
Такие вещи просто так нельзя считать по двум точкам. Выбираете достаточно много достаточно больших значений $n$, для каждого $n$ делаете несколько замеров умножения матриц $n\times n$, замеряете время $t$ и строите регрессию $t = C n^{\omega}$.

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение14.06.2017, 21:52 
Заслуженный участник
Аватара пользователя


16/07/14
8434
Цюрих
Andrey_Kireew в сообщении #1225503 писал(а):
но 1.5 секунды это уже терпимо, попробую ещё оптимизировать по Штрассену и уменьшить общее количество циклов
Попробуйте лучше взять готовую библиотеку (если есть возможность - MKL). Пытаться обогнать готовые решения в таких задачах - почти всегда пустая трата времени.

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение15.06.2017, 04:01 


07/10/15

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

Честно говоря до вчерашнего дня я в перемножении матриц вообще не видел никакой проблемы.

Надо подумать, может быть и библиотеку подключу, только MKL наверное не получится, там онлайн - инсталятор и всё такое... Может посоветуете что по проще?

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение15.06.2017, 08:45 
Заслуженный участник
Аватара пользователя


16/07/14
8434
Цюрих
openblass
Тот же API. Работает помедленнее, но не очень сильно.

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение15.06.2017, 14:21 


15/06/17

10
Andrey_Kireew в сообщении #1225268 писал(а):
В моё приложении на С++ основное время затрачивается на перемножение квадратных матриц...

В этом случае лучше использовать специализированные библиотеки линейной алгебры: у меня на 4-ех ядерном процессоре, поддерживающем команды fma, например, матрицы размерами 10000х10000 библиотека Intel MKL перемножает за 10 секунд. Т.е. матрицы размерами 1000х1000 будут перемножаться примерно за 0.01 с. или в 1000 раз быстрей, чем у вас.

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение15.06.2017, 15:36 
Аватара пользователя


07/02/12
1403
Питер
Во-первых, читать столбцы - не очень хорошо. Из-за особенностей работы кешей. Следует за квадратичную сложность сначала развернуть одну матрицу, причем так: читаем строку, пишем столбец.

Потом перемножать строка на строку. Внутренний цикл перевернуть и выкинуть оттуда все, кроме адресации по индексу и одновременно счетчику, вроде такого:
Используется синтаксис C++
for (int j = N - 1; j >= 0; j--)
  s+= pA[j]*pB[j];
 
И чего точно не стоит делать, это сохранять промежуточную сумму в память.

Затем, если написать этот цикл на ассемблере с использованием SIMD и, при необходимости, в несколько потоков, то все вопросы окончательно отпадут.

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение15.06.2017, 16:00 


15/06/17

10
bondkim137 в сообщении #1225733 писал(а):
Потом перемножать строка на строку...

Блоки строк.

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение15.06.2017, 17:14 
Заслуженный участник


20/08/14
11136
Россия, Москва
Можно обойтись без перевора всей матрицы, пересохранять лишь текущий столбец в дополнительный массив. Сложность та же, дополнительной памяти в $n$ раз меньше, исходная матрица не изменяется. Параллелить мне кажется логичнее самый внешний цикл (меньше накладных расходов).
Проше и логичнее воспользоваться готовой библиотекой, как выше указано, она достигает практически пиковой скорости вычислений.

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение15.06.2017, 17:29 
Аватара пользователя


07/02/12
1403
Питер
Dmitriy40 в сообщении #1225755 писал(а):
пересохранять лишь текущий столбец в дополнительный массив
Плюсую, как я сам не догадался :)
Dmitriy40 в сообщении #1225755 писал(а):
Параллелить мне кажется логичнее самый внешний цикл
Его и надо. Если вообще надо.
Dmitriy40 в сообщении #1225755 писал(а):
Проше и логичнее воспользоваться готовой библиотекой
Это если, конечно, спортивный/учебный интерес к низкоуровневой оптимизации отсутвует

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение15.06.2017, 21:32 
Заслуженный участник


20/08/14
11136
Россия, Москва
Если кому-то захочется повозиться с оптимизацией именно на языке С, то вот неплохой пример как это уже проделывали. Что характерно, после всех усилий (причём пошедших дальше чем здесь предлагали выше) библиотеку Intel MKL даже близко не догнали по скорости, разница осталась примерно порядка (10-15 раз)! Что неплохо иллюстрирует разницу между практикой и учёбой, если нужен результат на практике, то намного выгоднее воспользоваться плодом труда коллективного разума в виде библиотеки. ;-)

-- 15.06.2017, 22:11 --

Добавлю ещё две полезные в учебных целях ссылки на другой форум про оптимизацию перемножения матриц: раз (на C), два (ахтунг, ассемблер!).

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение15.06.2017, 22:27 


15/06/17

10
Dmitriy40 в сообщении #1225844 писал(а):
если нужен результат на практике, то намного выгоднее воспользоваться плодом труда коллективного разума в виде библиотеки.

Не всегда: например, для перемножения матриц
https://software.intel.com/en-us/forums ... pic/288850
а это для диагонализации
https://software.intel.com/en-us/forums ... pic/288316
https://software.intel.com/en-us/forums ... pic/288218
https://software.intel.com/en-us/forums ... pic/287728
https://software.intel.com/en-us/forums ... pic/289711
https://software.intel.com/en-us/forums ... pic/290238

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 64 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group