![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимизация скорости работы программ для технических расчетов
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 часа - нормально...