Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.047 c
1-1165436256
Pattern
2006-12-06 23:17
2007.02.04
Зависание программы


15-1168781554
Суперинтендант
2007-01-14 16:32
2007.02.04
Помогите


15-1168800324
Джо
2007-01-14 21:45
2007.02.04
Выбор «воздушки»


2-1168844996
Garacio
2007-01-15 10:09
2007.02.04
ListView сохранить в .ini


15-1168701177
Cerberus
2007-01-13 18:12
2007.02.04
Справочник по C++





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский