Форум: "Начинающим";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];
ВнизОптимизация скорости работы программ для технических расчетов Найти похожие ветки
← →
knever © (2007-01-18 13:47) [0]Для начала, спасибо всем кто согласить обсудить тему.
Иногда приходиться писать программы для расчета физических процессов. Если говорить о сложных и не стационарных прочесах, то 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
Спасибо...
← →
DrPass © (2007-01-18 13:58) [1]
> Первая моя мысль как оптимизировать поменять Double на Single
> помогло но не так как я думал
И не должно помочь. Размер данных - да, конечно. А объем вычислений ну никак не может сократиться. От того, что ты в троллейбус вместо 10 пассажиров посадишь 5, его скорость не увеличится. Точно так же и процессор. И double, и single обрабатываются фактически одной операцией.
> Идеи, которые скоро хочу попробовать, запихнуть все это
> в dll а вдруг поможет:)
Неа :)
> Попробую расчетную часть написать в на Assembler (правда
> с ним плохо знаком)
Скажем так - профессиональный ассемблерщик может написать код, лучший, чем это сделает оптимизирующий компилятор. Но это профессиональный.
Реальный выигрыш ты можешь получить, только если использовать дополнительные модули процессора - SSE, MMX и т.д. Но опять же, это только в том случае, если их возможности годятся для твоего алгоритма.
← →
knever © (2007-01-18 14:16) [2]
> Скажем так - профессиональный ассемблерщик может написать
> код, лучший, чем это сделает оптимизирующий компилятор.
> Но это профессиональный.
> И double, и single обрабатываются фактически одной операцией.
кокой и как?
можно использовать скажем сдвиг.
> Реальный выигрыш ты можешь получить, только если использовать
> дополнительные модули процессора - SSE, MMX и т.д.
как ими пользоваться?
← →
Сергей М. © (2007-01-18 14:24) [3]
> кокой и как?
>
> можно использовать скажем сдвиг.
>
>
Опа ... Приехали ...
Кокой сдвиг, конечно, и можно осуществить, но больно, черт побери !)
> как ими пользоваться?
В соответствии с мануалом производителя ЦП с соотв.системой команд.
← →
knever © (2007-01-18 14:26) [4]
> DrPass ©
> И не должно помочь. Размер данных - да, конечно. А объем
> вычислений ну никак не может сократиться. От того, что ты
> в троллейбус вместо 10 пассажиров посадишь 5, его скорость
> не увеличится. Точно так же и процессор. И double, и single
> обрабатываются фактически одной операцией.
Честно не совсем понятно почему мне казалось что (например)
double 8,876857457476457575765765868686846447^7,675765765757657567575757
рассчитывает дольше чем
single
8,8768574574764575^7,675765765 так как single может содержать меньшее количество знаков
← →
knever © (2007-01-18 14:27) [5]
> Сергей М. © (18.01.07 14:24) [3]
>
> В соответствии с мануалом производителя ЦП с соотв.системой
> команд.
очень помог:)
← →
Сергей М. © (2007-01-18 14:29) [6]
> knever © (18.01.07 14:26) [4]
>
>
Ты мануал к процессору от его производителя читал ? Прежде чем рассуждать про оптимизацию ?
> казалось
Когда кажется, тогда крестятся... Или штудируют спецлитературу по сабжу.
← →
Сергей М. © (2007-01-18 14:29) [7]
> очень помог
Старался как мог.
← →
Котик Б (2007-01-18 14:43) [8]
> вдруг начинает считать 140 миллиона расчетных величин и
> выводить их матрицами 2*(300*5800*40)…
Люди - по моему Вы зажрались !!!
Средняя выборка из базы данных длиться дольше чем 20-25 секунд...
А о таких скоростных показателях лет 5 назад можно было только мечтать :)
PS: Лет 10 тому учавствовал в разработке програмки для строительства (расчет напряжений в балках) - так полученный через 3-4 часа промежуточный результат - это считалось очень быстро, а вывод полной диаграммы напряжений за 24 часа - нормально...
← →
knever © (2007-01-18 15:08) [9]Сергей М. ©
Я не обиделся честно.
Но у меня к Вам убедительная просьба.
Форум это такой электронный разговор.
Ели вы можете помочь или сказать что дельное то скажите (например «Ты мануал к процессору от его производителя читал ? Прежде чем рассуждать про оптимизацию.», нет я не читал это и так ясно но вы как специалист могли дать ссылку где прочесть (по теме № главы ели это книга и т.д) или сказать если нет ссылки я тебе вышлю другими словами вы могли помочь»). А вы только показали что вы являетесь более квалифицированным специалистом по данной теме, причем не совеем корректно… причем даже мою опечатку нашли и обратили на это внимание
P.S. К вам не относиться это так шутка. «Лучше молчать и казаться идиотом – чем затоварить и развеять всякие сомнения»
← →
knever © (2007-01-18 15:11) [10]Котик Б
> Средняя выборка из базы данных длиться дольше чем 20-25
> секунд...
> А о таких скоростных показателях лет 5 назад можно было
> только мечтать :)
>
> PS: Лет 10 тому учавствовал в разработке програмки для строительства
> (расчет напряжений в балках) - так полученный через 3-4
> часа промежуточный результат - это считалось очень быстро,
> а вывод полной диаграммы напряжений за 24 часа - нормально.
> ..
Согласен Но сейчас машины по быстрее и я уверен что мою программу можно сделать быстрее если лишь разобраться в принципах работы компьютера. И я подумал что кто-то сталкивался с этой проблемой и сможет помочь.
← →
ors_archangel © (2007-01-18 15:15) [11]
> knever © (18.01.07 15:08) [9]
Оптимизация - неотрывна от задачи, какой мат аппарат у тебя?
← →
ors_archangel © (2007-01-18 15:16) [12]Например, стандартная 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;
← →
Сергей М. © (2007-01-18 15:17) [13]
> вы как специалист могли дать ссылку где прочесть
Ну ты сам подумай, о каких ссылках может идти речь, если ты даже не сподобился уточнить, о каком конкретно ЦП какого конкретно производителя идет речь ?
Это все равно что спросить "каким шанцевым инструментом - ложкой, вилкой, лопатой и т.д. и т.п. - мне за обедом употреблять некое заранее неизвестное вам блюдо"
)
← →
knever © (2007-01-18 15:19) [14]
> ors_archangel ©
Если я тебя правильно понял то мой мат аппарат это «нестационарная теплопроводность через критерий Фурье» это сложение и умножение построчно методом последовательных приближений.
← →
ors_archangel © (2007-01-18 15:19) [15]
> Сергей М. © (18.01.07 15:17) [13]
"программа на Delphi" вам не о чём не говорит
← →
knever © (2007-01-18 15:22) [16]Сергей М.
Что это даст? Пишу на одном компе люди работают на другом. Получаться что нужно как то… даже не знаю..
← →
Сергей М. © (2007-01-18 15:23) [17]
> ors_archangel © (18.01.07 15:19) [15]
> "программа на Delphi" вам не о чём не говорит
Абсолютно и о чем)
Делфи - это просто широкоизвестное имя интегрированной среды разработки приложений. БЕЗ очевидной (не требующей уточнения) привязки к конкретной аппаратно-программной платформе исполнения этих приложений.
← →
ors_archangel © (2007-01-18 15:24) [18]
> knever © (18.01.07 15:19) [14]
Я имел в виду, какие элементарные мат операции используются, можете привести фрагмент кода для примера?
И if с=0 then b:=10 медленнее C:=1000*10, потому что в первом случае есть ветвление, т.е. переход, т.е. рестрарт декодоров, сброс выборки и т.д., а во втором имеем одну операцию умножения, ещё смотри http://delphimaster.net/view/15-1169034260/
← →
Desdechado © (2007-01-18 15:24) [19]Приведи хоть пару формул и их реализаций в твоем коде.
Будет хоть повод поговорить об оптимизации, а то воду в ступе толчем.
← →
knever © (2007-01-18 15:24) [20]
> ors_archangel © (18.01.07 15:16) [12]
> Например, стандартная exp из Math оптимизируется на 133%:
>
Спасибо постараюсь разобраться.
← →
Сергей М. © (2007-01-18 15:25) [21]
> knever © (18.01.07 15:22) [16]
Возьми на вооружение пакет Intel Math kernel Library и не мучайся - пока еще добрая половина народа использует Intel- или Intel-совместимые процессоры.
← →
ors_archangel © (2007-01-18 15:27) [22]
> Сергей М. © (18.01.07 15:23) [17]
Извини, я просто подумал, что ты придераешься, беру свои слова обратно
← →
knever © (2007-01-18 15:28) [23]Извините сегодня все.
Desdechado ©
ок.
← →
ors_archangel © (2007-01-18 15:31) [24]
> knever © (18.01.07 15:22) [16]
Кстати да, можно перевести код в C и компилировать DLL с помощью Intel Compiler при полной оптимизации, уверен, будет ощутимый прирост посравнению с "оптимизирующим" компиляторм Delphi - ведь, как правильно сказал Сергей М., Делфи - "БЕЗ очевидной (не требующей уточнения) привязки к конкретной аппаратно-программной платформе исполнения этих приложений."
← →
Alx2 © (2007-01-18 21:08) [25]>knever © (18.01.07 15:19)
А почему-бы не уйти от последовательных приближений, или сократить их каким-нибудь стандартным сеточным методом? Потом, задачи теплопроводности - штука достаточно проработанная. Может, стоит в сети поискать быстрые устойчивые алгоритмы?
Хотя, я уже фантазирую. Как расчетная задача сформулирована?
← →
VEZ (2007-01-18 23:12) [26]Большинство функций используют в качестве параметров и результата Double-значение, то есть если передавать туда Single-значения, то получается будут лишние операции приведения типов.
← →
Сергей М. © (2007-01-19 09:38) [27]
> VEZ (18.01.07 23:12) [26]
Не все так просто.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.044 c