Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оптимизация скорости работы программ для технических расчетов


Страницы:   1 2

knever ©   (2007-01-18 13:47:00) 

Для начала, спасибо всем кто согласить обсудить тему.

Иногда приходиться писать программы для расчета физических процессов. Если говорить о сложных и не стационарных прочесах, то 20-40 тысяч расчетных величин в, прицепи достаточно.
Но вдруг начальство рассудило, что надо повысить точность и добавить пару элементов. И что же делать, если вдруг написанная программа на Delphi, вдруг начинает считать 140 миллиона расчетных величин и выводить их матрицами 2*(300*5800*40)…
Сразу появилось несколько нюансов.
1. Время расчета при загрузке ЦПУ 100%(по диспетчеру задач на PМ-1,7 512) 20-25 секунд.
2. Файл подкачки 2 ГБ!!!!

Уточнение:
2 массива [1..301,0..5841,0..41] array of Double объявлены как глобальные переменные.
Сократить количество величин нельзя и упростить формулы тоже.

Первая моя мысль как оптимизировать поменять Double на Single помогло но не так как я думал. Я думал что сократиться время расчета а оно вросло 28-33 секунды зато в место 1,8 стало около 700 Мб.

Идеи, которые скоро хочу попробовать, запихнуть все это в dll а вдруг поможет:)
Попробую расчетную часть написать в на Assembler (правда с ним плохо знаком)

Может кто сталкивался и что-нибудь подскажет, о оптимизации или о принципах роботы Delphi и компьютера с такими вещами.

Например меня всегда интересовало на какую сточку уходит больше ресурсов компьютера: сколько времени тратит( как это посчитать), и что дольше обрабатывается
if с=0 then b:=10
или
C:=1000*10

Спасибо...


Сергей М.   (2007-01-19 09:38:00) [1]


> VEZ   (18.01.07 23:12) [26]


Не все так просто.


VEZ   (2007-01-18 23:12:00) [2]

Большинство функций используют в качестве параметров и результата Double-значение, то есть если передавать туда Single-значения, то получается будут лишние операции приведения типов.


Alx2   (2007-01-18 21:08:00) [3]

>knever ©   (18.01.07 15:19)

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

Хотя, я уже фантазирую. Как расчетная задача сформулирована?


ors_archangel   (2007-01-18 15:31:00) [4]


>  knever ©   (18.01.07 15:22) [16]

Кстати да, можно перевести код в C и компилировать DLL с помощью Intel Compiler при полной оптимизации, уверен, будет ощутимый прирост посравнению с "оптимизирующим" компиляторм Delphi - ведь, как правильно сказал Сергей М., Делфи - "БЕЗ очевидной (не требующей уточнения) привязки к конкретной аппаратно-программной платформе исполнения этих приложений."


knever   (2007-01-18 15:28:00) [5]

Извините сегодня все.

Desdechado ©

ок.


ors_archangel   (2007-01-18 15:27:00) [6]


> Сергей М. ©   (18.01.07 15:23) [17]

Извини, я просто подумал, что ты придераешься, беру свои слова обратно


Сергей М.   (2007-01-18 15:25:00) [7]


> knever ©   (18.01.07 15:22) [16]


Возьми на вооружение пакет Intel Math kernel Library и не мучайся - пока еще добрая половина народа использует Intel- или Intel-совместимые процессоры.


knever   (2007-01-18 15:24:00) [8]


> ors_archangel ©   (18.01.07 15:16) [12]
> Например, стандартная exp из Math оптимизируется на 133%:
>
Спасибо постараюсь разобраться.


Desdechado   (2007-01-18 15:24:00) [9]

Приведи хоть пару формул и их реализаций в твоем коде.
Будет хоть повод поговорить об оптимизации, а то воду в ступе толчем.


ors_archangel   (2007-01-18 15:24:00) [10]


> knever ©   (18.01.07 15:19) [14]

Я имел в виду, какие элементарные мат операции используются, можете привести фрагмент кода для примера?
И if с=0 then b:=10 медленнее C:=1000*10, потому что в первом случае есть ветвление, т.е. переход, т.е. рестрарт декодоров, сброс выборки и т.д., а во втором имеем одну операцию умножения, ещё смотри http://www.delphimaster.ru/cgi-bin/forum.pl?id=1169034260&n=3


Сергей М.   (2007-01-18 15:23:00) [11]


> ors_archangel ©   (18.01.07 15:19) [15]
> "программа на Delphi" вам не о чём не говорит


Абсолютно и о чем)

Делфи - это просто широкоизвестное имя интегрированной среды разработки приложений. БЕЗ очевидной (не требующей уточнения) привязки к конкретной аппаратно-программной платформе исполнения этих приложений.


knever   (2007-01-18 15:22:00) [12]

Сергей М.

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


knever   (2007-01-18 15:19:00) [13]


> ors_archangel ©

Если я тебя правильно понял то мой мат аппарат это «нестационарная теплопроводность через критерий Фурье» это сложение и умножение построчно методом последовательных приближений.


ors_archangel   (2007-01-18 15:19:00) [14]


> Сергей М. ©   (18.01.07 15:17) [13]

"программа на Delphi" вам не о чём не говорит


Сергей М.   (2007-01-18 15:17:00) [15]


> вы как специалист могли дать ссылку где прочесть


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

Это все равно что спросить  "каким шанцевым инструментом - ложкой, вилкой, лопатой и т.д. и т.п. - мне за обедом употреблять некое заранее неизвестное вам блюдо"

)


ors_archangel   (2007-01-18 15:16:00) [16]

Например, стандартная exp из Math оптимизируется на 133%:
// From "How to optimize for the Pentium family of microprocessors"
// ©2000 Agner Fog:
// "FSCALE is often used in the calculation of exponential
// functions. The following code shows an exponential function
// without the slow FRNDINT and FSCALE instructions:"
function exp(x: extended): extended;
asm
{       ->      tbyte ptr [esp] - x argument
       <-      st0 - exp(x) value                  }
       FLDL2E
       FLD     TBYTE PTR [ESP+8]             // x
       FMUL                                  // z = x*log2(e)
       FIST    DWORD PTR [ESP+8]             // round(z)
       SUB     ESP, 12

       MOV     DWORD PTR [ESP], 0
       MOV     DWORD PTR [ESP+4], 80000000H
       FISUB   DWORD PTR [ESP+20]            // z - round(z)
       MOV     EAX, [ESP+20]
       ADD     EAX,3FFFH
       MOV     [ESP+8],EAX
       JLE     @@UNDERFLOW
       CMP     EAX,8000H
       JGE     @@OVERFLOW
       F2XM1
       FLD1
       FADD                                  // 2^(z-round(z))
       FLD     TBYTE PTR [ESP]               // 2^(round(z))

       ADD     ESP,12
       FMUL                                  // 2^z = e^x
       //fstp    tbyte ptr [esp+8]
       pop     ebp
       ret     12

@@UNDERFLOW:
       FSTP    ST
       FLDZ                                  // return 0
       //fstp    tbyte ptr [esp+8]
       ADD     ESP,12
       pop     ebp
       ret     12

@@OVERFLOW:
       PUSH    07F800000H                    // +infinity
       FSTP    ST
       FLD     DWORD PTR [ESP]               // return infinity
       //fstp    tbyte ptr [esp+8]
       ADD     ESP,16
       pop     ebp
       ret     12
end;


ors_archangel   (2007-01-18 15:15:00) [17]


> knever ©   (18.01.07 15:08) [9]

Оптимизация - неотрывна от задачи, какой мат аппарат у тебя?


knever   (2007-01-18 15:11:00) [18]

Котик Б


> Средняя выборка из базы данных длиться дольше чем 20-25
> секунд...
> А о таких скоростных показателях лет 5 назад можно было
> только мечтать :)
>
> PS: Лет 10 тому учавствовал в разработке програмки для строительства
> (расчет напряжений в балках) - так полученный через 3-4
> часа промежуточный результат - это считалось очень быстро,
>  а вывод полной диаграммы напряжений за 24 часа - нормально.
> ..

Согласен Но сейчас машины по быстрее и я уверен что мою программу можно сделать быстрее если лишь разобраться в принципах работы компьютера. И я подумал что кто-то сталкивался с этой проблемой и сможет помочь.


knever   (2007-01-18 15:08:00) [19]

Сергей М. ©

Я не обиделся честно.

Но у меня к Вам убедительная просьба.
Форум это такой электронный разговор.
Ели вы можете помочь или сказать что дельное то скажите (например «Ты мануал к процессору от его производителя читал ? Прежде чем рассуждать про оптимизацию.», нет я не читал это и так ясно но вы как специалист могли дать ссылку где прочесть (по теме № главы ели это книга и т.д) или сказать если нет ссылки я тебе вышлю другими словами вы могли помочь»). А вы только показали что вы являетесь более квалифицированным специалистом по данной теме, причем не совеем корректно… причем даже мою опечатку нашли и обратили на это внимание

P.S.  К вам не относиться это так шутка. «Лучше молчать и казаться идиотом – чем затоварить и развеять всякие сомнения»


Котик Б   (2007-01-18 14:43:00) [20]


> вдруг начинает считать 140 миллиона расчетных величин и
> выводить их матрицами 2*(300*5800*40)…


Люди - по моему Вы зажрались !!!

Средняя выборка из базы данных длиться дольше чем 20-25 секунд...
А о таких скоростных показателях лет 5 назад можно было только мечтать :)

PS: Лет 10 тому учавствовал в разработке програмки для строительства (расчет напряжений в балках) - так полученный через 3-4 часа промежуточный результат - это считалось очень быстро, а вывод полной диаграммы напряжений за 24 часа - нормально...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо