|
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 77
|
||||||
Попытка улучшить действующий код28.04.2016, 13:13. Показов 1129. Ответов 12
Добрый день! Появились желающие улучшить действующий код, который по заданной системе многочленов строит её базис Гробнера (по алгоритму F4). Вот сам проект github.com/galkinvv/gb_algs, собрал на debian 8.2 х64. Нужен вообще любой апдейт кода в плане скорости, даже немного, либо еще, как вариант, попытаться распараллелить алгоритм по дате. Сам не владею С++, писал только на жаве и не особо много, поэтому принимаю любую возможную помощь.
Может кто-нибудь откроет проект и посмотрит, что же можно заапдейтить и подскажет? Заранее благодарю, ребят. Вот отдельный файл из этого проекта с основным алгоритмом F4 (f4main.cpp). Если использовать распараллеливание, то скорее всего только тут.
0
|
||||||
| 28.04.2016, 13:13 | |
|
Ответы с готовыми решениями:
12
Как улучшить код?! Нужно улучшить код Попытка разобрать код |
|
Модератор
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
|
|
| 28.04.2016, 13:33 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 77
|
||
| 28.04.2016, 13:46 [ТС] | ||
|
0
|
||
|
Модератор
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
|
||
| 28.04.2016, 13:53 | ||
|
Добавлено через 1 минуту ...к чему я эти дурные вопросы задаю - можно "оптимизировать" 1000 строк а потом окажется что все время жрала одна единственная строка до которой руки так и не дошли потому что "мы считаем что это были другие строки". замерьте время выполнения
0
|
||
|
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 77
|
|
| 02.05.2016, 15:07 [ТС] | |
|
Да, как я и думал, функция в 123 строке потребляет очень много времени на некоторых примерах, что можно попробовать сделать для какого-нибудь, пусть даже маленького ускорения?
0
|
|
|
Модератор
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
|
|
| 02.05.2016, 21:09 | |
|
Aspromist, в 123 вообще комент, вы о редуцировании? Там несколько строк. Пре, ду и пост- какая?
0
|
|
|
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 77
|
|
| 03.05.2016, 20:22 [ТС] | |
|
Да, редуцирование жрет 99% времени работы всей программы. Конкретно doReduceMatrix, пре и пост вообще не расходуют времени, разве что наносекунды. Тоесть метод в 119 строке toRowEchelonForm. Он описан в файле работы с матрицами cmatrix.cpp. Вот его содержимое: http://pastebin.ru/S956w2pn#
В свою очередь управление передается функции в 755 строке, а она вызывает функцию в 626 строке. Присутствуют комментарии и это хорошо. Что можно сделать в этом месте как попытку улучшить код в каком-нибудь плане?
0
|
|
|
Модератор
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
|
|
| 03.05.2016, 23:47 | |
|
Aspromist, правильно ли я догадываюсь что в MPIDiagonalForm основное время потребляет либо forwardGaussElimination либо backGaussElimination?
Добавлено через 3 минуты ...а в них в свою очередь еще куча вызовов... причем меня немного насторожило что мы уже где-то в этой цепочке рассылали данные процессорам, а в нижестоящих функциях я тоже вижу рассылку, но я тут не спец может так надо...
0
|
|
|
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 77
|
|
| 04.05.2016, 10:11 [ТС] | |
|
Да, прямой и обратный ходы метода Гаусса расходуют все время, прямой метод расходует намного больше, вот к примеру:
ReducePre matrix: 0 millisec forwardGaussElimination: 104117 millisec backGaussElimination: 3421 millisec ReduceDo matrix: 107541 millisec ReducePost matrix: 0 millisec Примерно в таком соотношении происходят вычисления, то есть более чем в 10 раз по времени вычисляется дольше прямой метод Гаусса. Матрица делится на блоки построчно, которые рассылаются на разные процессоры для параллельного вычисления.
0
|
|
|
Модератор
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
|
|
| 04.05.2016, 11:34 | |
|
Aspromist, внутри forwardGaussElimination смотрели что жрет? reduceRangeByMatrix? а в нем reduceRangeByRow и fastReduceRangeByRange?
Добавлено через 5 минут ...я к тому что надо дорыть до собственно вычислений. обложка вряд ли потребляет время - время уходит на само действие Добавлено через 6 минут reduceRangeByMatrix->reduceRangeByRow->reduceRowByRow->getCoefByMonom (этого у меня нет) или addRowMultypliedBy (вот тут много цифр может оно) Добавлено через 7 минут addRowMultypliedBy ничего такого плохого не делает... Добавлено через 4 минуты fastReduceRangeByRange->fastReduceRangeByRangeConstOverflow, а в fastReduceRangeByRangeConstOverflow есть три вызова new / delete - это достаточно тяжелая вещь возможно следует оставлять выделенный кусок памяти живым и использовать повторно если размер подходит - это сэкономит время на вызов new Добавлено через 8 минут ...кроме того в fastReduceRangeByRangeConstOverflow создаются несколько std::vector которые не сильно быстрые, а особой нужны в них по коду я не увидел. возможно есть смысл уйти от них к обычным массивам
0
|
|
|
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 77
|
||||||
| 04.05.2016, 15:28 [ТС] | ||||||
|
в reduceRangeByMatrix 2 пути в зависимости от толщины блоков, если блоки толщины в 1 строку, то запускается for с reduceRangeByRow, иначе for с fastReduceRangeByRange. Толщина блоков регулируется в доп параметрах при запуске уже самой программы. У меня с блоками толщины в 1 строку работает быстрее, но наверняка есть случаи когда выгоднее иначе делать. А в этих функциях в свою очередь есть еще forы. Поэтому очень большое количество итераций reduceRowByRow (они в случае блоков толщины 1), хотя каждая выполняется молниеносно. Вот файл cmatrix.h в котором в 106-й строке описан getCoefByMonom:
0
|
||||||
|
Модератор
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
|
|
| 04.05.2016, 16:51 | |
|
в getCoefByMonom очень настораживает поиск - каким бы он ни был это тоже емкая операция.
насколько отличаются показатели времени для первой ветки и второй (когда туча вызовов reduceRowByRow или один fastReduceRangeByRange)?
0
|
|
|
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 77
|
|
| 04.05.2016, 17:53 [ТС] | |
|
Для 1-й ветки, когда блок толщины в 1 строку и используется много вызовов reduceRowByRo 10679 millisec, для 2-й ветки с блоком толщины в 2 строки 17598 millisec. Но это только 1 тест. Пробовал несколько других, все-равно 1 ветка быстрее работает. Может быть другая будет эффективнее на процессорах с большим количеством ядер, чем у меня, у меня 2 физических и 4 виртуальных. http://mech.math.msu.su/~fpm/p... k08402.pdf Это статья по этому проекту, там в конце 1 главы говорится, что реализованные параллельные алгоритмы показали довольно неплохие результаты, что подтверждается экспериментальными вычислениями
на многопроцессорных кластерах с распределённой памятью.
0
|
|
| 04.05.2016, 17:53 | |
|
Помогаю со студенческими работами здесь
13
Помогите улучшить простой код Перегрузка функций - улучшить код Матрица порядка N (упростить/улучшить код) Как улучшить свой код и его структуру?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2.
Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники".
В. . .
|
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии.
. . .
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3.
Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
|