|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
beg-in-er, Analyze->Start Performance Analysis Программа запустится. Закроете когда нужно оно нарисует красивыю картинку и список функций. Щелкайте нужную функцию и она покажет цветом проблемные участки в теле функции. А у меня терпения не хватило колупаться в этом всем. Вы очень хорошо акценты поставили. Буду в readonly наблюдать. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 02:52 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
меня терзали смутные сомнения. а что же не так во всём этом. все ухищрения с переводом двумерного массива в набор одномерных массивов взятых в с++ с помощью getmem ( или рекурсионно зафиксинных в шарпе ) всё это может и даст результат. но эффект от таких действий максимум 10-20 раз. что в общем-то уже великолепно. НО червяк остался. и он был прав. Средненько реализованных , но великолепный алгоритм, будет всегда лучше прекрасно реализованного , но плохого алгоритма. у ТС и реализация херовая ( я не про организацию программы - это отдельно ) и сам алгоритм для разреженной матрицы - говнище редкостное. вот тот тормозной код, выделенный в метод. размер b_05=8436, gn=10140 в матрице меньше процента не нулевых элементов.( 1 к 270 ) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
цымес в этой строке Код: c# 1.
эта строка выполняется примерно 1.400.000 раз а предварительная проверка на не ноль Код: c# 1.
500.000.000 раз. в 370 раз чаще. вот тут тормоза и сидят. нет бы выделить ненулевые элементы и получить нужные элементы m[j2, i + i2], но нет. короче этот тормозной метод можно ускорить смело , на вскидку, в 1.000 раз. ( по крайней мере , на тех данных , что были представлены). наверно при желании, скорость можно поднять и в 3.000 раз. и получить те незабвенные 10 секунд. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 08:32 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Т.С. задача сводится к тому что бы найти все тройки i, i2, j2 и произвести 1.400.000 вычислений строки ( ну или сколько там будет) Код: c# 1.
тут наверное и секунды будет достаточно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 09:17 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
beg-in-er, сделал я вот что. Запустил на расчет схему размером 9980 с полулентой 1840, это ближе к схеме 10100х1870, считаемой в коммерческой программе. И уже получил результат 160 секунд против 8 секунд. Отличие в 20 раз, это уже ближе. Постараюсь сделать тестовые примеры с полным совпадением параметров: размерность, лента, плотность заполнения. Еще интересно, теперь прога работает на обеих машинах без проблем. Не знаю как этого добился: переустановил ли Micr Visual 2010 C# Express, или дополнительно установил другой пакет программ - Visual Studio ознакомительная версия, или подергал настройки в родном компиляторе. В настройках процедуры подготовки проекта было много вещей которые совсем не знаю для чего нужны и как они работают В результате схема из Documents2 считанулась на ноутбуке за 45 минут. Как сделать так, чтобы не делать проверку на ноль а работать только с "мясом" массива, даже не соображу. Как-то получить топологию на последовательность вычислений. Сделать отдельную матрицу с целыми числами, дающими номера ячеек для вычислений. И здесь надо определять не тройки, а двойки i2 j2. i - последовательные. i - это очередной исключаемый столбец, i2 - номер обрабатываемой строки при исключении столбца, j2 - ненулевой элемент уже внутри строки Еще по поводу нулей - не проверял, но интуитивно при приближении к середине счета количество нулей сильно уменьшается из-за сложения строк. Это видно, сначала счетчик бежит быстро, а как раз в средней трети медленее всего. А вконце снова быстро, потому что от матрицы остается небольшой треугольничек ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 12:34 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решеткасделал я вот что. Запустил на расчет схему размером 9980 с полулентой 1840, это ближе к схеме 10100х1870, считаемой в коммерческой программе. И уже получил результат 160 секунд против 8 секунд. Отличие в 20 раз, это уже ближе. Постараюсь сделать тестовые примеры с полным совпадением параметров: размерность, лента, плотность заполнения. может там та прога считает с использованием openCL какого нибудь. + посмотри насколько используется проц. может там распараллелено все? я пока добился что documents2 минут за 5 считается. (+ памяти жрет в 2 раза больше). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 13:54 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
FsShoman, автор Код: c# 1.
именно тройки i, i2, j2. т.к. i существует только в цыкле. если отказыватся от этих цыклов , то и i пропадает. вы спросили что тормозит прогу, я вам написал 2 жирных пункта. меняйте алгоритм и делайте одномерный массив. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 14:22 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
beg-in-erFsShoman, автор Код: c# 1.
именно тройки i, i2, j2. т.к. i существует только в цыкле. если отказыватся от этих цыклов , то и i пропадает. вы спросили что тормозит прогу, я вам написал 2 жирных пункта. меняйте алгоритм и делайте одномерный массив. одномерный массив не помогает. пробовал. (прироста практически 0) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 14:25 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решеткаЕще по поводу нулей - не проверял, но интуитивно при приближении к середине счета количество нулей сильно уменьшается из-за сложения строк. Это видно, сначала счетчик бежит быстро, а как раз в средней трети медленее всего. А вконце снова быстро, потому что от матрицы остается небольшой треугольничек Вчера когда запустил прогу меня тоже смутило что скорость вычислений замедляется. Когда закомментировал строку проверки на ноль получил просадку резко на первых итеррациях. Тогда до меня дошло, что количество этих самых нулей уменьшается по ходу расчета. Раз такая пьянка и алгоритмы менять не хотите, м. б. попробуете распараллелить - можно ли каждую итеррацию внешнего цикла отдавать в отдельный поток? (не вникал в то как действует алгоритм). Скажите это самописный код или есть программа которая генерирует этот код? Меня просто раздирает любопытство. Я например не в состоянии охватить такое количество задействованных идентификаторов и прочего. Потому для меня это нереальное что-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 14:43 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
FsShoman, не уверен, но распараллеленный метод Гаусса это он же многофронтальный метод? P.S. забыл сказать, что считать эти задачи надо все-таки в double переменных. Большая иначе погрешность получается. Float брал просто попробовать насколько быстрее будет Не очень удачное название темы. Правильнее сказать - "Реализованный на C# метод Гаусса решения СЛАУ медленно работает. Почему?". И скинуть только исходник касающийся именно прямого хода по Гауссу без СТРАШНЫХ, но безобидных блоков по сбору матрицы ансамбля ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 14:54 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
ой... чтобы не быть не верно понятым... пусть у вас N ядер берем N следующих итерраций самого внешнего цикла и отдаем N потокам и т. д.. освободился один из потоков дали ему следующую. или же разделить количество итераций внешнего цикла на N и отдать эти пачки N потокам, пусть молотят. насколько алгоритм в текущем состоянии готов к этому? не используются ли данные предыдущих итерраций в последующих? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 14:55 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
FsShoman одномерный массив не помогает. пробовал. (прироста практически 0) вобщем ниверю. но это не так важно. для разреженной матрицы должен быть другой алгоритм и там будет всё по другому. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 14:57 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Lord Britishпусть у вас N ядер берем N следующих итерраций самого внешнего цикла и отдаем N метод не паралелится. последущие итерации используют результаты от предыдущих ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 15:06 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
хотя, распараллеливать не приняв во внимание советы beg-in-er. и продолжая ждать чуда. это примерно, как подпирать небоскреб шваброй надеясь, что он не упадет. надо менять причину, а не следствие. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 15:06 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
beg-in-erLord Britishпусть у вас N ядер берем N следующих итерраций самого внешнего цикла и отдаем N метод не паралелится. последущие итерации используют результаты от предыдущих OK ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 15:07 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
[quot beg-in-er]FsShomanвобщем ниверю. так я ж не заставляю. попробуй :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 15:10 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
FsShoman, есть мнение. Вот сейчас открыл на этом форуме раздел Программирование, вкладку C++, набил в поиске "решение слау методом гаусса" и выплыли 2 темы, 7-го и 10-го годов. Потом выполнил поиск вот в этой вкладке WinForms, .NET Framework и выплыла только одна моя тема. И я боюсь даже представить, сколько тем на такой запрос будет во вкладке по Delphi. Нисколько не хочу принизить возможности современного объектно- и проблемно-ориентированного языка C#, очень замечательного, но может для этой задачи он напрямую не подходит? Есть чувство что я микроскопом забиваю гвозди. В книжке Э.А. Ишковой "C# начала программирования" в самом конце в параграфе 3.11 есть настораживающие высказывания. Например это MSIL. Microsoft Intermediate Language расшифровывается. Псевдокод, промежуточный язык, который системой CLR (Common Language Runtime), являющейся составной частью оболочки Framework.NET, переводится в исполняемый код во время запуска программы. То есть, машинный код управляет ячейками памяти через посредников, да? Цена такого посредничества - замедление в 10-20 раз. Наверное надо нагруженные вычислениями операции делать отдельными dll-элементами, написанными и скомпилированными например в Паскале или Си. Но не делать этих вычислений напрямую в составе Main. Один раз запрограммировал решение СЛАУ в автолиспе, и запускал прямо из командной строки автокада. Не буду говорить какие по объему матрицы и сколько времени считались, дабы не перепугать форумчан ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 23:38 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решеткаЦена такого посредничества - замедление в 10-20 раз. отладчиком команды посмотри - не так всё страшно ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 23:52 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решетка, Качественно троллите :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 23:59 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решеткаТо есть, машинный код управляет ячейками памяти через посредников, да? Нет. MSIL код компилируется в машинный код при запуске приложения и запускается на исполнение. Без посредников. Изучающий си решеткаЦена такого посредничества - замедление в 10-20 раз. Уверен что в данном случае дело в реализации алгоритма, а не выбранной технологии. FsShoman же написал что смог оптимизировать выполнение для данных documents2 до 5 минут. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2013, 00:07 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
FsShoman, вышли как-нибудь исходник и exe с реализацией оптимизации с 20 минут до 5. "пока добился что documents2 минут за 5 считается. (+ памяти жрет в 2 раза больше)." - вот это попробую у себя прогнать Занчит MSIL непричем. Понятно Наткнулся у плюс-плюсовцев на такую штуку - расширенный алгоритм Евклида для нахождения обратного числа. То есть не делить единицу на диагональный элемент, а по этому алгоритму находить 1.0/aii и в программе использовать только исключительно сложение и умножение. Не уверен что облегчит, деление происходит очень мало, всего gn раз, то есть 10000 раз для Documents2 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2013, 00:38 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решетка, причина , как я понимаю в кэшпромахах. на документе 2 происходит 8.753.123.047 сравнений на ноль. if (m[i2 + j2, i] != 0.0) из них результативных 929.478.716 , которые не равны нулю, т.е. непосредственно умножений. память постоянно загружается в кэш проца, но крайне не эффективно. найдите эти пары i2 , j2 для каждого i, и только их и умножайте. вот возьмём одину строку m[i,1] в столбце 1 пусть в ней не нулевые элементы m[4,1] m[9,1] m[16,1] соответсвенно пары i2 , j2 будут 4,0 4,5 4,12 9,0 9,7 16,0 сумма этих пар должна быть равна 4, 9 или 16 4+5=9 4+12=16 9+7 =16 только при таких значениях i2 , j2 будет происходить умножение в столбце №1. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2013, 01:07 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решеткаесть мнение. Вот сейчас открыл на этом форуме раздел Программирование, вкладку C++, набил в поиске "решение слау методом гаусса" и выплыли 2 темы, 7-го и 10-го годов. Потом выполнил поиск вот в этой вкладке WinForms, .NET Framework и выплыла только одна моя тема. И я боюсь даже представить, сколько тем на такой запрос будет во вкладке по Delphi. Нисколько не хочу принизить возможности современного объектно- и проблемно-ориентированного языка C#, очень замечательного, но может для этой задачи он напрямую не подходит? Есть чувство что я микроскопом забиваю гвозди. В книжке Э.А. Ишковой "C# начала программирования" в самом конце в параграфе 3.11 есть настораживающие высказывания. Например это MSIL. Microsoft Intermediate Language расшифровывается. Псевдокод, промежуточный язык, который системой CLR (Common Language Runtime), являющейся составной частью оболочки Framework.NET, переводится в исполняемый код во время запуска программы. То есть, машинный код управляет ячейками памяти через посредников, да? Цена такого посредничества - замедление в 10-20 раз. ну на самом деле не 10-20 раз конечно. года 3 назад нужно было 5к алгоритмов реализовать. с использованием параллельной обработки. ради любопытства реализовывал каждый на C++ (mpi) и C# (threads) (. я конечно не гуру C++.) но C# медленнее работал на 40%-200% процентов в зависимости от задачи. тоесть в 1.4-4 раза медленнее. больше всего выигрыш c++ был как раз при работе с памятью (в C# не использовал unsafe). на вычислениях выигрыш до 2х раз но не более. Изучающий си решеткавышли как-нибудь исходник и exe с реализацией оптимизации с 20 минут до 5. "пока добился что documents2 минут за 5 считается. (+ памяти жрет в 2 раза больше)." - вот это попробую у себя прогнать к сожалению тут я ошибся. погонял начальную прогу и мою. результат не совпадает. видимо остается оптимизировать сам алгоритм. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2013, 08:40 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
а вообще конечно такие вещи в современном мире на GPU решают. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2013, 08:50 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
beg-in-er, "память постоянно загружается в кэш проца, но крайне не эффективно" - есть ли способ внутри цикла объявить переменную, которая как раз и будет находиться непосредственно в кэше проца? как я понимаю у нас m[ij] элемент матрицы несколько раз один и тот же вызывается по ссылке: при проверке на ноль, умножении и сложении. А если его сразу писануть в отдельную переменную, путь к которой наиболее короткий, и использовать при проверке и вычислениях. Наверное работать с переменными объявленными new не совсем эффективно. Есть другие способы объявления переменной? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2013, 09:53 |
|
Консольное приложение медленно считает. Почему?
|
|||
---|---|---|---|
#18+
Изучающий си решеткаоторая как раз и будет находиться непосредственно в кэше проца? кэш с регистрами не попутали? будет ли переменная в регистре храниться - всё на совести JIT-компилятора. Чтоб не гадать - смотрите в отладчике нативный код. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2013, 10:13 |
|
|
start [/forum/topic.php?fid=20&msg=38114709&tid=1405335]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 319ms |
total: | 481ms |
0 / 0 |