powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Консольное приложение медленно считает. Почему?
55 сообщений из 55, показаны все 3 страниц
Консольное приложение медленно считает. Почему?
    #38111567
Решена задача МКЭ для расчета объемной задачи теории упругости.
Для матрицы системы размером 10000 степеней свободы, ее фрагментация на 2 треугольные (прямой ход по гауссу) занял 1 час 20 минут, это очень много. Должно быть примерно 10 секунд. Учтена ленточная симметричная форма матрицы и обход нулей. Используемый тип данных 4-х байтовый, float.
Компилятор Microsoft Visual C# 2010 Express Edition.
Хотя наверно не в компиляторе дело.
Структура программы - одно пространство имен, один класс, переменные объявляются в функции Main посредством new. Переменные для вычислений передаются в другие функции как аргументы. Другие функции вызываются в Main через один и тот же объект ob. Все эти функции public, в основном void.
Может, я запускал программу из отладчика? Но я не нашел других команд меню. Отладка -> построить решение. Или на панели Построение кнопка Построить. В папке проекта есть bin, в ней Release, в ней исполняемый exe.
Считает правильно, но медленно.
В процессе счета переменные находятся в оперативной памяти, с жесткого диска ничего не читается

Могу выслать исходник и текстовые файла с вводными данными, если кому интересно мне помочь ...
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38111583
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучающий си решетка,
ежли матрица 10К*10К, то элементов 100М. приведение к треугольному виду 100М операций деления. секунда, две не более. ну 10 секунд ( если совсем старый проц)

для решения подобных задач используется один 2мерный массив, временная переменаня и функции прохода по строкам. что там ещё можно создавать оператором new?

явно что то в логике проги не так. нет ли случаем в проге LINQ?

пс. тут телепатов мало. и хрустальных шаров дефицит.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38111584
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучающий си решетка, если программа выводит что-то в консоль во время расчетов, то убери их или уменьши их кол-во т.к. вывод в консоль работает медленно.

Изучающий си решеткафрагментация на 2 треугольные занял 1 час 20 минут, это очень много. Должно быть примерно 10 секунд
Откуда цифра в 10 секунд взялась? Сравнивал с чужой программой? Я не знаю что такое фрагментация матрицы в задаче МКЭ, но возможно ее решение можно распаралелить и ускорить поиск решения.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38111599
Фотография Абсолют
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучающий си решеткаРешена задача МКЭ...
Use CLR Profiler Luke.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38111675
beg-in-er,

10K*10K, здесь К - это килобайт? но тогда 10000 float это 4 байта * 10000 = 40000 байт = 40К (примерно)?
Тогда матрица будет не 100M, а 1600M?
М - это мегабайт, да?
Процессор у меня 1,3ГГц, оперативной памяти 4ГБ.
Оператор new в процессе проходки не используется, new только задает (в данном случае) переменную, массив 10000х10000, в который помещается матрица исходная.
То что вывод в консоль предусмотрен, это ни при чем, и с ним и без него одинаково работает.

Вот исходник в приложенном файле, этот пресловутый прямой ход по Гауссу - строки в тексте программы с 637 по 686.

И вообще вся прога медленно работает, и подготовка матрицы, и обратный ход тоже медленный.
Еще интересно, думал что заменить тип данных с double на float, это раза в два как минимум ускорит, а выигрыш по времени получился всего-то процентов на 30-40
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38111731
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучающий си решетка,

это точно ваш код.
это просто неописуемое зрелище.
Функция main 700 строк, да с такими вкраплениями...
даже сложно сказать , где там что не так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
   float[,] sxyz = new float[96, 24];
            float[] cxx00 = new float[24];
            float[] cxx10 = new float[24];
            float[] cxx01 = new float[24];
            float[] cxx20 = new float[24];
            float[] cxx02 = new float[24];
            float[] cxx30 = new float[24];
            float[] cxx03 = new float[24];

            float[] cyy00 = new float[24];
            float[] cyy10 = new float[24];
            float[] cyy01 = new float[24];
            float[] cyy20 = new float[24];
            float[] cyy02 = new float[24];
            float[] cyy30 = new float[24];
            float[] cyy03 = new float[24];

            float[] czz00 = new float[24];
            float[] czz10 = new float[24];
            float[] czz01 = new float[24];
            float[] czz20 = new float[24];
            float[] czz02 = new float[24];
            float[] czz30 = new float[24];
            float[] czz03 = new float[24];


            float[] cxy00 = new float[24]; float[] cyx00 = new float[24];
            float[] cxy10 = new float[24]; float[] cyx10 = new float[24];
            float[] cxy01 = new float[24]; float[] cyx01 = new float[24];
            float[] cxy20 = new float[24]; float[] cyx20 = new float[24];
            float[] cxy02 = new float[24]; float[] cyx02 = new float[24];
            float[] cxy30 = new float[24]; float[] cyx30 = new float[24];
            float[] cxy03 = new float[24]; float[] cyx03 = new float[24];

            float[] cyz00 = new float[24]; float[] czy00 = new float[24];
            float[] cyz10 = new float[24]; float[] czy10 = new float[24];
            float[] cyz01 = new float[24]; float[] czy01 = new float[24];
            float[] cyz20 = new float[24]; float[] czy20 = new float[24];
            float[] cyz02 = new float[24]; float[] czy02 = new float[24];
            float[] cyz30 = new float[24]; float[] czy30 = new float[24];
            float[] cyz03 = new float[24]; float[] czy03 = new float[24];



хотя.....странно вы сами считаете
матрица 10К*10К , даэто 10.000 на 10.000 элементов. т.е. 100.000.000 элементов. по 4 байта это будет 400Мб , а не 1.6 Гб

предметно.
методы урежте в размерах. и выясните , какой метод тормозит. с замерами.
а то боюсь вы и сами не в курсах , где тормоза идут.
пишите в лог, и думайте.

пс. код просто Жесть.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38111800
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучающий си решетка, выложи все файлы с данными которые нужны для работы программы.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38111827
beg-in-er,

да, правильно, объем матрицы 400Mb. Это я умножил конфеты на конфеты, а нужно умножать конфеты на их количество. Все правильно, 400М
Эта матрица довольно разреженная, хотя и с широкой лентой (ширина ленты почти равна количеству строк).
При решении этой же задачи на коммерческой настоящей МКЭ программе гаусс занял 9 секунд. Процессор машины был в два раза быстрее. Рациональная перенумерация узлов дала ширину ленты 1900. Суммируя это, можно сказать что на моей машине в моей проге гаусс должен был бы занять примерно 1,5 минуты. То есть у меня проигрыш по времени примерно в 100 раз, не больше.

А это тормозит, если например создавать не массив, а много отдельных переменных со своими именами и обращаться к ним по их именам? Как мне кажется, не должно тормозить.

Или это плохо, организовавать самый нагруженный вычислительный цикл for в составе Main?

Объявлять переменные внутри Main это тормозит? Лучше объявлять переменные в классе и обращаться к ним через объект?

То что код ЖЕСТЬ, согласен. Пою как могу, пускай что слуха нет
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38111883
bazile,

вот они. Там и readme есть. Задача поменьше, 1500х1500 примерно

Еще непонятно, прога считает нормально только на той машине, где скомпилирована. Хотя и там и там семерка стоит. На одной home basic, на другой обычная
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38112064
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-erпс. код просто Жесть.
Можно сознание потерять, читая этот дикий код...
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38112439
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучающий си решеткавот они. Там и readme есть. Задача поменьше, 1500х1500 примерно
На моей машине этот пример отрабатывает за пару секунд. Дай пример который занимает больше часа на твоей машине. Без него нельзя будет нормально измерить на что именно столько времени уходит.

Код: c#
1.
Еще непонятно, прога считает нормально только на той машине, где скомпилирована. Хотя и там и там семерка стоит. На одной home basic, на другой обычная 


Что значит "считает нормально"? Результат неправильный? Падает с ошибкой?

Кстати, у тебя в программе баг связанный с преобразованием string в float. Ты исходишь из того что разделитель целой и дробной части всегда точка. Это не так. Чтобы не было проблем надо явно указать культуру при преобразовании или в начале main поставить Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38112706
bazile,

эта задача занимала больше часа.

на другой машине не работает, это значит что рассчитываются только небольшие задачи размером 100-200. Если больше, то возможны два варианта:
1) ничего не вылетает, но в результатах NaN. Как будто были деления на ноль.
2) задача вылетает, с сообщением что памяти мало.

может так быть, что бесплатный компилятор от microsoft плохо подходит для обработки большого объема данных, или я неправильно его использую? Прежде чем компилировать конечный продукт, нужно делать какие-либо настройки компилятора?

По поводу запятой в действительном числе, у меня их в принципе не может быть, исходные данные я генерю автолисп-файлом из CAD-программы. Но про эту инфу спасибо, погуглю что это такое и как применять
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38112735
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучающий си решетка,
автор задача вылетает, с сообщением что памяти мало.
и сколько она памяти кушает , когда час работает? и сколько на компе ОЗУ?
( и какая целевая платформа х86? и какой пень? интел иль амд.)


зы . предьявы к компилятору и прочие орг вопросы тут нипричём. не они причина тормозов. проблема либо в нехватки ОЗУ, либо, что вероятнее - реализация алгоритма швах.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113067
FsShoman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задачи из Documents2.rar посчиталась за 20 минут. i5 (использовалось 1 ядро) 8гб оперативки. (использовалось 500мб).
99% времени работы программы пришлось на 2 цикла на 50 строк кода. значит имеет смысл попробовать оптимизировать их. если конечно задача позволяет.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113095
FsShoman,

скинь мне пожалуйста exe, который 20 минут считал. Мой комп W7 Домашняя расширенная, Service Pack1, процессор Intel Pentium CPU 967 @ 1.3HGz, оперативки 4Гб, 64-разрядная система. Это ноутбук Acer Aspire V5-5 Series с диагональю 15 дюймов, стоил 16000руб.
Может быть что 20 минут близко к истине, потому что задача в Documents2 имела широкую ленту, почти равную размерности задачи. А узкая лента сильно сокращает общий объем вычислений, причем не знаю, пропорционально ли ширине ленты.

Еще спрашивали какая целевая платформа, x86? К сожалению не знаю что это такое и где посмотреть
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113104
FsShoman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изучающий си решетка,

тоже собирал под x86, под x64 прироста не добавило.
сейчас решил 1 оптимизацию попробовать. поэтому екзешника не осталось. код уже измененный. сейчас доделаю, если спать не уйду, то скину. или с утра уже.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113116
FsShoman,

да давай завтра. Попробую на настоящей программе для сравнения большое кольцо рассчитать. У кольцевой схемы по определению должна быть широкая лента. Если результаты будут по продолжительности счета близкие, то может зря я народу голову морочил
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113119
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучающий си решеткаFsShoman,

да давай завтра. Попробую на настоящей программе для сравнения большое кольцо рассчитать. У кольцевой схемы по определению должна быть широкая лента. Если результаты будут по продолжительности счета близкие, то может зря я народу голову морочил

ну соглядайте. ваша матрица из Documents2.rar (если она 1.5К*1.5К) жрёт 360 метров.
можно предположить, что 10К*10К жрёт в 44 раза больше. т.е. около 16Гигов. ну очевидно, что если столько ОЗУ нет, то будет постоянная работа с винтом ))) отсюда и такая скорость.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113126
beg-in-er,

нет, в Documents2 уже залита матрица 10К*10К, точно. А 1.5К*1.5К была в Documents первом. Так что оперативки всегда и у всех хватало, когда я считал у себя, открывал диспетчер задач. Не помню точно, но свободной памяти много было, несколько сот Mb
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113151
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучающий си решеткаbeg-in-er,

нет, в Documents2 уже залита матрица 10К*10К, точно. А 1.5К*1.5К была в Documents первом. Так что оперативки всегда и у всех хватало, когда я считал у себя, открывал диспетчер задач. Не помню точно, но свободной памяти много было, несколько сот Mb

Я скачал исходник. Сначала ужаснулся. Потом в голову пришла мысль что исходник генерится чем-то. Потом закралась мысль а вдруг не генеренная и что автор вундеркинд. Я без подколов исключительно с добрыми намерениями говорю это. Развейте мои заблуждения. Попробую тоже поколупаться. Не знаю на сколько меня хватит только :)
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113167
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InvarianCulture? пришлось переставить региональные настройки чтобы заработало.

Бросилось в глаза с какой целью делается так в некоторых функциях, которые участвуют в циклах

Program ob = new Program();

выполните поиск гляньте.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113176
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Люто затроллил конечно. Сам все таки принимать участие не буду но за процессом посмотрю.

ps. запустил на своей развалюхе core2duo 2.13/4Gb считала бы где то час а т и дольше.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113188
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Больше я ниасилил, до
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113189
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Больше я ниасилил, дошел до процесса, как на каринке вот что выдал профайлер. Может поможет часть оптимизировать.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113205
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord British,
как получить такую картинку ? )))
Анализ->мастер производительности ?
ткните пальцем.

по теме.
помимо банальной опптимизации , типа замены в том цыкле.
Код: c#
1.
2.
3.
 float fz = m[i2, i];
 int N = b_05 - i2 - 1;
 int ii2 = i + i2;


по копеечке , но придаст ускорение.

есть вещи более тяжёлые.
вот простенький код , который показывает стоимость вызова
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
       class FLOAT_CONTAINER
        {
          public  float[] F = new float[2];
        }
        unsafe static void K0()
        {
            float[] FF = new float[2];
            float FF0;
            fixed (float* F0 = FF)
            {
                float* F4 = F0;
                FF0 = K1(F4);
            }
        }
        unsafe static float K1(float* FLOAT_UNSAFE)
        {
            int NX = 0, NY = 0;
            float F_VALUE = 1.0F;

            float[,] MATRIX_2X2 = new float[2, 2];
            float[] FLOAT_SIMPLE = new float[2];
            
            FLOAT_CONTAINER[] CASTED_MASTRIX = new FLOAT_CONTAINER[2];
            CASTED_MASTRIX[NX] = new FLOAT_CONTAINER();

            //ПОСМОТРИМ НА СТОИМОСТЬ ВЫЗОВА
            CASTED_MASTRIX[NX].F[NY] = F_VALUE;
            MATRIX_2X2[NX, NY] = F_VALUE;
            FLOAT_SIMPLE[NX] = F_VALUE;
            FLOAT_UNSAFE[NX] = F_VALUE;

            return MATRIX_2X2[0, 0] + CASTED_MASTRIX[0].F[0];
        }



DASM:
//ПОСМОТРИМ НА СТОИМОСТЬ ВЫЗОВА
CASTED_MASTRIX[NX].F[NY] = F_VALUE;

000000b7 mov eax,dword ptr [ebp-0Ch]
000000ba mov edx,dword ptr [ebp-8]
000000bd mov ecx,dword ptr [ebp-20h]
000000c0 cmp edx,dword ptr [ecx+4]
000000c3 jb 000000CA
000000c5 call 69F2A4C4
000000ca mov edx,dword ptr [ecx+edx*4+0Ch]
000000ce mov edx,dword ptr [edx+4]
000000d1 cmp eax,dword ptr [edx+4]
000000d4 jb 000000DB
000000d6 call 69F2A4C4
000000db fld dword ptr [ebp-10h]
000000de fstp dword ptr [edx+eax*4+8]

MATRIX_2X2[NX, NY] = F_VALUE;

000000e2 mov eax,dword ptr [ebp-8]
000000e5 mov edx,dword ptr [ebp-0Ch]
000000e8 mov ecx,dword ptr [ebp-18h]
000000eb sub eax,dword ptr [ecx+10h]
000000ee cmp eax,dword ptr [ecx+8]
000000f1 jb 000000F8
000000f3 call 69F2A4C4
000000f8 sub edx,dword ptr [ecx+14h]
000000fb cmp edx,dword ptr [ecx+0Ch]
000000fe jb 00000105
00000100 call 69F2A4C4
00000105 imul eax,dword ptr [ecx+0Ch]
00000109 add eax,edx
0000010b fld dword ptr [ebp-10h]
0000010e fstp dword ptr [ecx+eax*4+18h]

FLOAT_SIMPLE[NX] = F_VALUE;

00000112 mov eax,dword ptr [ebp-8]
00000115 mov edx,dword ptr [ebp-1Ch]
00000118 cmp eax,dword ptr [edx+4]
0000011b jb 00000122
0000011d call 69F2A4C4
00000122 fld dword ptr [ebp-10h]
00000125 fstp dword ptr [edx+eax*4+8]

FLOAT_UNSAFE[NX] = F_VALUE;

00000129 mov eax,dword ptr [ebp-4]
0000012c mov edx,dword ptr [ebp-8]
0000012f fld dword ptr [ebp-10h]


можно невооруженным глазом заметить, что стоит перейти на одномерные массивы, так скорость должна явно увеличиться.
а используя неуправляемую память - ещё больше.
//при взяти памяти напрямую, через getmem в c++, скорость тоже может раза в 2 подрасти , посравнению с массивом в шарпе.

ваши дальнейшие действия зависят от того, насколько важна эта задача. т.е. скорость её выполнения
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113212
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-er,

Analyze->Start Performance Analysis

Программа запустится. Закроете когда нужно оно нарисует красивыю картинку и список функций. Щелкайте нужную функцию и она покажет цветом проблемные участки в теле функции.

А у меня терпения не хватило колупаться в этом всем. Вы очень хорошо акценты поставили. Буду в readonly наблюдать.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113295
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
меня терзали смутные сомнения. а что же не так во всём этом.
все ухищрения с переводом двумерного массива в набор одномерных массивов взятых в с++ с помощью 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.
void K11(float[,] m, int b_05, int gn)
        {
            float k_1_aii = 0;
            float[,] m_2 = new float[b_05, gn - 1];    /*вторая треугольная матрица*/
            for (int i = 0; i < gn - b_05 + 1; i++)
            {
                /*обнуление столбца*/
                k_1_aii = -1 / m[0, i];
                for (int i2 = 1; i2 < b_05; i2++)
                    if (m[i2, i] != 0.0)
                        for (int j2 = 0; j2 < b_05 - i2 - 1; j2++)
                            if (m[i2 + j2, i] != 0.0)
                                m[j2, i + i2] = m[j2, i + i2] + m[i2 + j2, i] * k_1_aii * m[i2, i];
            }
        }



цымес в этой строке
Код: c#
1.
m[j2, i + i2] = m[j2, i + i2] + m[i2 + j2, i] * (-1 / m[0, i]) * m[i2, i];


эта строка выполняется примерно 1.400.000 раз
а предварительная проверка на не ноль
Код: c#
1.
if (m[i2 + j2, i] != 0.0)


500.000.000 раз. в 370 раз чаще. вот тут тормоза и сидят.

нет бы выделить ненулевые элементы и получить нужные элементы m[j2, i + i2], но нет.

короче этот тормозной метод можно ускорить смело , на вскидку, в 1.000 раз. ( по крайней мере , на тех данных , что были представлены).
наверно при желании, скорость можно поднять и в 3.000 раз.

и получить те незабвенные 10 секунд.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113318
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.С.
задача сводится к тому что бы найти все тройки i, i2, j2
и произвести 1.400.000 вычислений строки ( ну или сколько там будет)
Код: c#
1.
m[j2, i + i2] = m[j2, i + i2] + m[i2 + j2, i] * (-1 / m[0, i]) * m[i2, i];


тут наверное и секунды будет достаточно.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113671
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 - ненулевой элемент уже внутри строки
Еще по поводу нулей - не проверял, но интуитивно при приближении к середине счета количество нулей сильно уменьшается из-за сложения строк. Это видно, сначала счетчик бежит быстро, а как раз в средней трети медленее всего. А вконце снова быстро, потому что от матрицы остается небольшой треугольничек
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113906
FsShoman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изучающий си решеткасделал я вот что. Запустил на расчет схему размером 9980 с полулентой 1840, это ближе к схеме 10100х1870, считаемой в коммерческой программе. И уже получил результат 160 секунд против 8 секунд. Отличие в 20 раз, это уже ближе.
Постараюсь сделать тестовые примеры с полным совпадением параметров: размерность, лента, плотность заполнения.

может там та прога считает с использованием openCL какого нибудь. + посмотри насколько используется проц. может там распараллелено все?

я пока добился что documents2 минут за 5 считается. (+ памяти жрет в 2 раза больше).
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113977
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FsShoman,
автор
Код: c#
1.
И здесь надо определять не тройки, а двойки i2 j2. i - последовательные. 


именно тройки i, i2, j2. т.к. i существует только в цыкле. если отказыватся от этих цыклов , то и i пропадает.
вы спросили что тормозит прогу, я вам написал 2 жирных пункта. меняйте алгоритм и делайте одномерный массив.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38113986
FsShoman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
beg-in-erFsShoman,
автор
Код: c#
1.
И здесь надо определять не тройки, а двойки i2 j2. i - последовательные. 


именно тройки i, i2, j2. т.к. i существует только в цыкле. если отказыватся от этих цыклов , то и i пропадает.
вы спросили что тормозит прогу, я вам написал 2 жирных пункта. меняйте алгоритм и делайте одномерный массив.

одномерный массив не помогает. пробовал. (прироста практически 0)
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114030
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучающий си решеткаЕще по поводу нулей - не проверял, но интуитивно при приближении к середине счета количество нулей сильно уменьшается из-за сложения строк. Это видно, сначала счетчик бежит быстро, а как раз в средней трети медленее всего. А вконце снова быстро, потому что от матрицы остается небольшой треугольничек

Вчера когда запустил прогу меня тоже смутило что скорость вычислений замедляется. Когда закомментировал строку проверки на ноль получил просадку резко на первых итеррациях. Тогда до меня дошло, что количество этих самых нулей уменьшается по ходу расчета. Раз такая пьянка и алгоритмы менять не хотите, м. б. попробуете распараллелить - можно ли каждую итеррацию внешнего цикла отдавать в отдельный поток? (не вникал в то как действует алгоритм).

Скажите это самописный код или есть программа которая генерирует этот код? Меня просто раздирает любопытство. Я например не в состоянии охватить такое количество задействованных идентификаторов и прочего. Потому для меня это нереальное что-то.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114052
FsShoman,

не уверен, но распараллеленный метод Гаусса это он же многофронтальный метод?

P.S.
забыл сказать, что считать эти задачи надо все-таки в double переменных. Большая иначе погрешность получается. Float брал просто попробовать насколько быстрее будет

Не очень удачное название темы. Правильнее сказать - "Реализованный на C# метод Гаусса решения СЛАУ медленно работает. Почему?". И скинуть только исходник касающийся именно прямого хода по Гауссу без СТРАШНЫХ, но безобидных блоков по сбору матрицы ансамбля
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114056
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой...

чтобы не быть не верно понятым...

пусть у вас N ядер берем N следующих итерраций самого внешнего цикла и отдаем N потокам и т. д.. освободился один из потоков дали ему следующую.

или же разделить количество итераций внешнего цикла на N и отдать эти пачки N потокам, пусть молотят.

насколько алгоритм в текущем состоянии готов к этому? не используются ли данные предыдущих итерраций в последующих?
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114059
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FsShoman
одномерный массив не помогает. пробовал. (прироста практически 0)
вобщем ниверю.
но это не так важно. для разреженной матрицы должен быть другой алгоритм и там будет всё по другому.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114081
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord Britishпусть у вас N ядер берем N следующих итерраций самого внешнего цикла и отдаем N
метод не паралелится. последущие итерации используют результаты от предыдущих
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114083
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя, распараллеливать не приняв во внимание советы beg-in-er. и продолжая ждать чуда. это примерно, как подпирать небоскреб шваброй надеясь, что он не упадет. надо менять причину, а не следствие.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114086
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-erLord Britishпусть у вас N ядер берем N следующих итерраций самого внешнего цикла и отдаем N
метод не паралелится. последущие итерации используют результаты от предыдущих

OK
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114092
FsShoman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot beg-in-er]FsShomanвобщем ниверю.
так я ж не заставляю. попробуй :)
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114663
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.

Один раз запрограммировал решение СЛАУ в автолиспе, и запускал прямо из командной строки автокада. Не буду говорить какие по объему матрицы и сколько времени считались, дабы не перепугать форумчан
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114673
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучающий си решеткаЦена такого посредничества - замедление в 10-20 раз.
отладчиком команды посмотри - не так всё страшно
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114676
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучающий си решетка,

Качественно троллите :)
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114679
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучающий си решеткаТо есть, машинный код управляет ячейками памяти через посредников, да?
Нет. MSIL код компилируется в машинный код при запуске приложения и запускается на исполнение. Без посредников.

Изучающий си решеткаЦена такого посредничества - замедление в 10-20 раз.
Уверен что в данном случае дело в реализации алгоритма, а не выбранной технологии. FsShoman же написал что смог оптимизировать выполнение для данных documents2 до 5 минут.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114692
FsShoman,

вышли как-нибудь исходник и exe с реализацией оптимизации с 20 минут до 5.
"пока добился что documents2 минут за 5 считается. (+ памяти жрет в 2 раза больше)." - вот это попробую у себя прогнать

Занчит MSIL непричем. Понятно

Наткнулся у плюс-плюсовцев на такую штуку - расширенный алгоритм Евклида для нахождения обратного числа. То есть не делить единицу на диагональный элемент, а по этому алгоритму находить 1.0/aii и в программе использовать только исключительно сложение и умножение. Не уверен что облегчит, деление происходит очень мало, всего gn раз, то есть 10000 раз для Documents2
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114709
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучающий си решетка,

причина , как я понимаю в кэшпромахах.
на документе 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.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114818
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 раз.

ну на самом деле не 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 раза больше)." - вот это попробую у себя прогнать


к сожалению тут я ошибся. погонял начальную прогу и мою. результат не совпадает.

видимо остается оптимизировать сам алгоритм.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114826
FsShoman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а вообще конечно такие вещи в современном мире на GPU решают.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114880
beg-in-er,

"память постоянно загружается в кэш проца, но крайне не эффективно" - есть ли способ внутри цикла объявить переменную, которая как раз и будет находиться непосредственно в кэше проца? как я понимаю у нас m[ij] элемент матрицы несколько раз один и тот же вызывается по ссылке: при проверке на ноль, умножении и сложении. А если его сразу писануть в отдельную переменную, путь к которой наиболее короткий, и использовать при проверке и вычислениях. Наверное работать с переменными объявленными new не совсем эффективно. Есть другие способы объявления переменной?
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114910
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучающий си решеткаоторая как раз и будет находиться непосредственно в кэше проца?
кэш с регистрами не попутали?

будет ли переменная в регистре храниться - всё на совести JIT-компилятора.

Чтоб не гадать - смотрите в отладчике нативный код.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114978
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, я всё веселье пропустил, но
вот это

if( m[]!=0

ЖЕСТЬ! Заменил бы хотя бы на m[] < epsilon что-ли (при работе с числами с плавающей точкой нужно помнить о машинной точности представления числа)
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38114980
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сравнивать, разумеется, модуль
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38115012
SS19
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
была когда-то подобная задача - динамика правда,не статика - надо было решить систему с 900 неизвестными около 200000 раз. Матрица была довольно разряженная - 3% заполнения. Оценочное время выполнения используя массив и метод Гауса получилось 270 суток. Поэтому вместо массива использовал ссылочную структуру - каждый элемент имел 5 ссылок - по 4 направлениям и на свободный член. В этой реализации время расчета составило 9 часов.
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38115076
SS19,

скиньте синтаксис построения и использования ссылочной структуры, C# язык знаю крайне поверхностно
...
Рейтинг: 0 / 0
Консольное приложение медленно считает. Почему?
    #38115218
SS19
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы используете двумерный массив и для навигации по нему используете "координаты" элемента [i,j] - в ссылочной структуре используются ссылки на элементы: объявляете класс "Элемент_матрицы", в котором, кроме значения элемента, координат и ... т.д, будет еще 4 ссылки: object p_up, p_down, p_left, p_right.
При "заполнении" матрицы создаете только ненулевые элементы и связываете их (получаете связный список) . При обходе матрицы при решении методом Гауса используя навигацию по ссылкам Вы не будете обрабатывать нулевые элементы - в этом и состоит ускорение в расчете
Тут есть одна "пакость" - у меня была динамика (т.е. данная матрица рассчитывалась очень много раз - струкрура не менялась, менялись значения элементов) - поэтому я один раз решал определял дополнительные ненулевые элементы, которые вознакают во время решения методом Гауса - и использовал эту "расширенную" матрицу при расчетах.
Если Вы считаете МКЭ - то, скорее всего, Вы делаете несколько (десятков, сотен) расчетов, для того, чтобы определить критичные точки и нагрузки для какой-то конструкции - если это так: сохраните структуру "расширенной" матрицы (на диск,в БД) и используйте ее как шаблон

Я это делал в далеком 95 году - писал на паскале
...
Рейтинг: 0 / 0
55 сообщений из 55, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Консольное приложение медленно считает. Почему?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]