| Автор |
Съобщение |
|
DanielDimov
Ранг: Почетен член
Регистриран на: Нед Фев 16, 2014 3:36 pm Мнения: 953
|
 Полезни алгоритми
Не намирам точна тема за това нещо и реших да създам нова... Ако администраторите решат че има по-добро място - да я преместят!
Темата е за споделяне на алгоритми или кратки решения, които могат да бъдат полезни и на другите.
Първото нещо което може да ви е полезно е целочислен алгоритъм за изчисляване на корен квадратен. Понякога се налага на процесор който няма FPU да се смятат много корени и тогава това нещо помага страшно много. Тествал съм го задълбочено на x86 и е около 6 - 7 пъти по бързо в сравнение с емулация на FPU и около 15% по-бавно от FPU варианта на sqrt. Предполагам че АРМ-овете с ядра М0 или М3 ще могат да сметнат почти толкова корена колкото и M4 на същата честота (това трябва да се тества разбира се)!
|
| Съб Юни 27, 2015 9:10 am |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: Полезни алгоритми
Виж как се прави без делене 
_________________ Мразя да мразя ...
|
| Съб Юни 27, 2015 9:23 am |
|
 |
|
DanielDimov
Ранг: Почетен член
Регистриран на: Нед Фев 16, 2014 3:36 pm Мнения: 953
|
 Re: Полезни алгоритми
ами то деленето не бави (поне не и на процесорите на които може да ми потрябва)
|
| Съб Юни 27, 2015 9:52 am |
|
 |
|
Desert Leo
Ранг: Форумен бог
Регистриран на: Чет Фев 10, 2005 3:25 pm Мнения: 5677 Местоположение: София
|
 Re: Полезни алгоритми
Даниеле, идеята ти за тема с алгоритми е добра, но но защо не спомена, че това е метода на Newton-Raphson. Имам някакъв спомен, ако разликата между предната стойност и текущата е 1, алгоритъма зацикля. Ето още малко алгоритми: http://www.mathpath.org/Algor/squareroot/algor.square.root.iterations.htm
|
| Съб Юни 27, 2015 10:45 am |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: Полезни алгоритми
Деленето е едно от нещата, които бавят абсолютно навсякъде. За разлика от умножението и шифтовете, които в общия случай са по 1-2 цикъла (за сравнение, делението е 10-30 цикъла за 32 битови числа).
|
| Съб Юни 27, 2015 11:10 am |
|
 |
|
DanielDimov
Ранг: Почетен член
Регистриран на: Нед Фев 16, 2014 3:36 pm Мнения: 953
|
 Re: Полезни алгоритми
Моя код не зацикля.
На процесора с който в момента се занимавам делението е 3 такта винаги. Току що пробвах скоростта на sqrt_u32 на моя компютър и е доста добра - fastSqrt прави 981 мил. сметки в секунда, а sqrt_u32 прави 974 мил. Хубавото на втория алгоритъм е че времето за изпълнение е по-предвидимо (ще варира в по-малки граници).
|
| Съб Юни 27, 2015 11:24 am |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
 Re: Полезни алгоритми
|
| Съб Юни 27, 2015 11:26 am |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: Полезни алгоритми
Има огромна разлика между микроконтролер и процесор, когато говорим за делене и плаваща запетая.
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Съб Юни 27, 2015 12:40 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
 Re: Полезни алгоритми
Абе то и доста контролери имат DIV ама ... ей сега погледнах последното на коеот писах, дърта 51-ка, 8 цикъла е тая команда срещу 2-4 за всички останали, а има и не малко по 1 цикъл ... не може да мериш х86 с контролер, дори и от по-модерните. Това от линка на woody е доста добро и работи със задоволителна грешка.
|
| Съб Юни 27, 2015 2:07 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: Полезни алгоритми
Кой е процесора и колко битово е делението?
|
| Съб Юни 27, 2015 2:40 pm |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: Полезни алгоритми
Кода съм го оптимизирал за ARM и GCC ... компилирай и дизасемблирай с включени оптимизации да видиш разликата - всяка итерация я бях докарал до няколко инструкции доколкото помня ... за х86 не ме интересува кой е по бърз - двата процесора имат големи разлики на ниво инструкции така, че този код компилиран за х86 е нормално да е бавен 
_________________ Мразя да мразя ...
|
| Съб Юни 27, 2015 5:28 pm |
|
 |
|
DanielDimov
Ранг: Почетен член
Регистриран на: Нед Фев 16, 2014 3:36 pm Мнения: 953
|
 Re: Полезни алгоритми
Процесорчето с което се занимавам в момента е LPC1833, а делението е 32-битово... обаче току-що проверих в документацията и се оказа, че съм запомнил грешно - делението е от 2 до 12 такта! Ще пробвам кой от двата метода ще е по-бърз на него конкретно защото на PC-то всичко е доста различно.
|
| Нед Юни 28, 2015 8:10 am |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: Полезни алгоритми
Браво, много добра оптимизация, почти 1 000 MIPS-а от 180MHz процесор.
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Нед Юни 28, 2015 9:30 am |
|
 |
|
DanielDimov
Ранг: Почетен член
Регистриран на: Нед Фев 16, 2014 3:36 pm Мнения: 953
|
 Re: Полезни алгоритми
Все още не съм тествал скоростта на микроконтролера. Това което писах по-горе като скорост е на Intel P8600 на 2.4 GHz
|
| Нед Юни 28, 2015 10:16 am |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
 Re: Полезни алгоритми
За SQRT деленето все ще клони към 12 такта, няма да е страшно бързо но пък и едва ли ти трябва да го смяташ 10 млн пъти в секунда, предполагам функцията ще хаби по около 100-200 такта средно, освен ако нямаш кълбо за гадаенето.
|
| Нед Юни 28, 2015 11:43 am |
|
|