|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 8:02 pm
cortex-m0/armv6m асемблерски библиотечки
| Автор |
Съобщение |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: cortex-m0/armv6m асемблерски библиотечки
Ами ръчно разписан алгоритъм винаги ще трябва да работи с 64 битови числа, няма как. Като брой цикли/инструкции най вероятно няма да има кой знае каква разлика с едно просто шифтване бит по бито - ама идеята ме грабна и ще го разпиша да видя как ще стане. Мисля, че GCC ще генерира страшно сбит код за нормални 32 битови ARM, но за Thumb2 ме съмнява да е толкова елегантно. Ще го видим, на работа не ми се занимава с това, довечера докато си почивам 
_________________ Мразя да мразя ...
|
| Сря Окт 29, 2014 12:44 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: cortex-m0/armv6m асемблерски библиотечки
сигурен съм... Проблемът не е в това, че имат бъг... всеки допуска бъгове. Проблемът е, че това е версия на функциията в случай че не се използва компилатора на АРМ и че тоя бъг като гледам не съм открил аз и други са го видели и са писали и реакция никаква. Да не говорим че и това дето са го сътворили е адски неефективно. Worst case е поне 150-200 клока. При условие, че в АРМ блога някой си играл да напише статия и е предложил версия с 14 клока. Нямаше да го кажа това, ако беше единичен случай. Аз почнах сам да си ги правя нещата още от АРМ7. Там няма инструкция за деление, ок. Стандартно деление отнема 400-500 клока. Да, обаче има редица случаи, в които се дели на константа. Примерно в printf като печаташ число и го преобразуваш в десетично ползваш деление на 10. Това е особен случай на деление, тъй като константата може да се разложи на полином и делението може да се сведе до 12 клока мисля бяха. И това беше документирано в референс мануала на кура. Няма как да не го види човек, ще ти извади очите... Познай обаче как правят printf - за всяка цифра от резултата викаха по два пъти стандартното деление... Демек printf("%u", 12345) може да ти изяде 5000-10000 клока. Недай си боже като мен да ползваш трейсове в интеръпти и всичко ти отива в киреча... При М3 добавиха инструкция за делене и чат-пат нещата се позакърпиха, стига обаче да не ползваш 64-бит. Щото като няма инструкция за 64-бит компилаторът си търси съответнта функция от стандартната библиотека и като я няма там и си слага цикълчето от 60-те години със събиране и изваждане. И айде пак стигаш до супер неефективно деление, при условие че 64-бит деление може да се сведе до няколко 32-бит операции за които има инструкции и всичко да стане за няколко (до десетки) вместо за хиляди клокове... Така че проблемът със стандартните библиотеки не е от вчера... Виж в CMSIS добавиха разни DSP библиотечки, което е супер. Само че защо не оправят прости стандартни библиотечки? Дали не е защото техния компилатор не ги ползва? Честно казано не знам как стоят нещата с техния компилатор, знам само че си има собствени библиотечки за тия неща... а и наскоро се вдигна голяма патаклама, че се опитаха и да му вдигат цената на 20к евро за работно място. Та на тия цени предполагам трябва да са се постарали и да са си написали читави библиотечки. Няма лошо, нека да си ги продават, само че някак си не върви хем да правиш евтини процесори, хем скъпи компилатори.
|
| Сря Окт 29, 2014 12:50 pm |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
 Re: cortex-m0/armv6m асемблерски библиотечки
и... за къв чеп на някой ще му трябва да брои водещите нулeви битове? даже не знаех, че има такава функция нещо FIR специфично ли е? и за къв чеп им е да не говорим за самия int32_t
|
| Сря Окт 29, 2014 12:55 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: cortex-m0/armv6m асемблерски библиотечки
Ми Дедо или съм бил тъп на времето или сега правя простотия да ползвам M0, ама така или иначе в някои драйвери ползвам CLZ. Примерно в STM-а като ми дойде прекъсване трябва да проверя от кои линии, че там gpio-exti lines си ебало мамата. Та да не цикля бит по бит съм ползвал CLZ което за М3/4 е 1 инструкция за 1 клок. И те така... сега или трябва да си преправям драйверите или да добавя CLZ, ама така или иначе за съвместимост е редно да имам всички стандартни неща. Така че сега първо добавям CLZ и т.н. пък после ще видя дали да оптимизирам местата дето го ползват. Иначе в CMSIS гледам го ползват при изчисление на "1/x". Което пак поставя същия проблем дето имам аз - дали да се пренапише функцията или не, щото това CLZ някой го е сложил уж за ускорение, а на М0 ще стане забявяне....
|
| Сря Окт 29, 2014 1:05 pm |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
 Re: cortex-m0/armv6m асемблерски библиотечки
Не виждам какъв е проблема !? Аз често ползвам собственни типове и то точно с цел лесното им предефиниране според платформа, оптимизации и т.н.
|
| Сря Окт 29, 2014 1:19 pm |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
 Re: cortex-m0/armv6m асемблерски библиотечки
ползвай си, никой не те спира. ако само ти си четеш кода, може би и ще си го разбираш в случая няма никакъв смисъл да се ползва q31_t вместо, още почвече, че внася неяснота. поне мен ме озадачи какво е q31 и питах гугъла, за да разбера. да, може би има някакъв резон за се полва int32 или uint32, но поне при него няма да се чешеш, където не те сърби. програмите се четат от хора. на компилатора му все тая. и когато се налага да се ровиш в чужд код, това обикновено е при някаква авария и не си настроен философски, пред камината и чаша хенеси в ръка. пък понякога се налага и сам да си ровиш в твоя код и не би трябвало да ти минават мисли от рода на "кой идиот го е писал ТОВА!" миро, сори за офтопика.
|
| Сря Окт 29, 2014 1:40 pm |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
 Re: cortex-m0/armv6m асемблерски библиотечки
Това, че не можеш да схванеш смисъла на нещо - не го прави непременно глупаво и безполезно! Гледай си хардуера - дано там се оправяш по-добре 
|
| Сря Окт 29, 2014 1:48 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: cortex-m0/armv6m асемблерски библиотечки
По принцип CLZ трябва да е с unsigned, a не signed параметър. Поне така е дефинирана функцията и инструкцията в останалите курове. Някои компилатори и статик анализатори държат на тия подробности! Освен това предефинирането на типове трябва да се прави с някаква цел. Безцелното преименуване само прави кода нечетим и води до грешки. Да не говорим. че стандартните функции трябва да са декларирани със стандартни типове. Обратното означава че функцията не е стандартна! едит: да обобщя: 1. Бъг в алгоритъма 2. Бъг в типа на параметъра 3. Стандартна функция с нестандартен параметър 4. Ненужна смяна на тип 5. Неефективен алгоритъм колко още неща могат да се объркат във функция от 5 реда?
|
| Сря Окт 29, 2014 1:49 pm |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: cortex-m0/armv6m асемблерски библиотечки
Няма за какво, човек да се хаби ... хакерите всичко са измислили вече: http://www.hackersdelight.org/hdcodetxt/nlz.c.txtИма и други интересни алгоритми, полезно ...
_________________ Мразя да мразя ...
|
| Сря Окт 29, 2014 3:58 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: cortex-m0/armv6m асемблерски библиотечки
Там е работата, че всяка архитектура си има особености... горното може да е ефективно за x86, обаче за М0 е много далеко от истината  За CLZ най-бърз е варианта с таблица както е обяснен туказ съм го опитимизирал още малко (смъкнах от 1-6 клока):  |  |  |  | Код: ldr r3,=_qclz_table // [0+2] point to our look-up table lsrs r2,r0,#16 // [2+1] test bytes 3:2 beq _a16_r0 // [3+1/3] if zero, we have 16+ bytes 1:0 lsrs r0,r2,#8 // [4+1] we have 0+ bytes 3:2, test byte 3 beq _a8_r2 // [5+1/3] if zero, we have 8+ byte 2 ldrb r0,[r3,r0] // [6+2] convert byte 3 to a count bx lr // [8+3] _a16_r0: lsrs r2,r0,#8 // [6+1] test byte1 beq _a24_r0 // [7+1/3] if zero, we have 24+ byte 0 ldrb r0,[r3,r2] // [8+2] convert byte 1 adds r0, #16 // [10+1] bx lr // [11+3] _a8_r2: ldrb r0,[r3,r2] // [8+2] convert byte to a count between 0 and 8 */ adds r0, #8 // [10+1] bx lr // [11+3] _a24_r0: ldrb r0,[r3,r0] // [10+2] convert byte 1 adds r0, #24 // [12+1] bx lr // [13+3] |  |  |  |  |
Без таблица е нещо такова:  |  |  |  | Код: movs r1,#32 /* [1] we have 32 bits in a 32-bit word as usual */ lsrs r2,r0,#16 /* [1] test high 16 bits */ beq skip16 /* [1/3] if zero, jump forward */ subs r1,#16 /* [1] otherwise decrement our counter (result) */ mov r0,r2 /* [1] and keep new value */ skip16: lsrs r2,r0,#8 /* [1] test bits 31..23 or 15..8 */ beq skip8 /* [1/3] if zero, jump forward */ subs r1,#8 /* [1] otherwise decrement our counter (result) */ mov r0,r2 /* [1] and keep new value */ skip8: lsrs r2,r0,#4 /* [1] test bits 31..28 or 15..8 */ beq skip4 /* [1/3] if zero, jump forward */ subs r1,#4 /* [1] otherwise decrement our counter (result) */ mov r0,r2 /* [1] and keep new value */ skip4: lsrs r2,r0,#2 /* [1] test bits 31..23 or 15..8 */ beq skip2 /* [1/3] if zero, jump forward */ subs r1,#2 /* [1] otherwise decrement our counter (result) */ mov r0,r2 /* [1] and keep new value */ skip2: lsrs r0, #1 subs r0, r1, r0 |  |  |  |  |
за по-нагледно на Ц изглежда така: и така без таблица Не съм ги тествал още, може да има правописни грешки 
|
| Сря Окт 29, 2014 4:46 pm |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: cortex-m0/armv6m асемблерски библиотечки
В линка не е специфичен х86 код - даже на много от функциите си пише колко инструкции са за RISC  Най оптималното е с таблица и умножение по шантава константа?! Е на тая скопена Cortex-M нещата са си различни, но виж на АРМ32 със условното изпълнение на инструцкии си е красота да го гледа човек на асемблер ...
_________________ Мразя да мразя ...
|
| Сря Окт 29, 2014 5:02 pm |
|
 |
|
scout_3pm
Ранг: Популярен
Регистриран на: Вто Авг 07, 2012 3:16 pm Мнения: 331
|
 Re: cortex-m0/armv6m асемблерски библиотечки
Миро, браво за онагледяването.
|
| Сря Окт 29, 2014 6:58 pm |
|
 |
|
bobihot
Ранг: Форумен бог
Регистриран на: Сря Фев 13, 2013 3:35 pm Мнения: 1803
|
 Re: cortex-m0/armv6m асемблерски библиотечки
To самото >> 16 се изпълнява за кой знае колко цикъла.. I386+ инструкциите май го имаха вградено търсенето на първият сенат бит? Но и там една инструкция се изпулнява аз колкото водещи нули има такта 
|
| Съб Ное 01, 2014 2:47 am |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: cortex-m0/armv6m асемблерски библиотечки
При ARM, всъщност при почти всички RISC шифтването е 1 клок. Останалите куртекси имат броене на водещите нули също за 1 клок и поради тая причина го имам заложено в сорсовете дето сега компилирам за М0. Другото дето са оптимизирали при М0 и ме мъчи, че за различки от всички останали АРМ-чета не може да комбинира шифт и аритметична/логична операция в 1 клок. Работата с флагове също е много скопена... ама такъв е живота, не може да очакваш супер-дупер за 1$ 
|
| Съб Ное 01, 2014 10:38 am |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
 Re: cortex-m0/armv6m асемблерски библиотечки
както винаги цитираш отделни пасажи и почваш да философтваш ! ето го оригиналния ми пост - в него няма нищо към теб: коментара ми е за това, че : - само "блондинка програмист" ще тръгне да търси деклация на тип с гугъл (при положение че има сорсовете)!
|
| Съб Ное 01, 2014 1:54 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|