Отговори на тема  [ 33 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща
cortex-m0/armv6m асемблерски библиотечки 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: cortex-m0/armv6m асемблерски библиотечки
ps66 написа:
palavrov написа:
Хрумна ми как може да се направи това броене супер елегантно с двоично търсене - довечера ще го разпиша на C и ще го постна ... т.е. за 64 бита с 6 итерации намираш колко са водещите нули ;)

твоя "алгоритъм" е елементарен, но едва ли някой би го оценил!
трудността му е log2(64), но трябва да ползваш 32bit, 16bit, 8bit, 4bit, 2bit, 1bit операции ... и като нищо ефективността му ще отиде по дяволите

Ами ръчно разписан алгоритъм винаги ще трябва да работи с 64 битови числа, няма как. Като брой цикли/инструкции най вероятно няма да има кой знае каква разлика с едно просто шифтване бит по бито - ама идеята ме грабна и ще го разпиша да видя как ще стане. Мисля, че GCC ще генерира страшно сбит код за нормални 32 битови ARM, но за Thumb2 ме съмнява да е толкова елегантно. Ще го видим, на работа не ми се занимава с това, довечера докато си почивам :)

_________________
Мразя да мразя ...


Сря Окт 29, 2014 12:44 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: cortex-m0/armv6m асемблерски библиотечки
ps66 написа:
сигурен ли си, че някъде няма декларирано нещо като:
#define CLZ(data) (data ? __CLZ(data) : 0)


сигурен съм...

Проблемът не е в това, че имат бъг... всеки допуска бъгове. Проблемът е, че това е версия на функциията в случай че не се използва компилатора на АРМ и че тоя бъг като гледам не съм открил аз и други са го видели и са писали и реакция никаква. Да не говорим че и това дето са го сътворили е адски неефективно. 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ви битове? даже не знаех, че има такава функция :oops:
нещо FIR специфично ли е?

и за къв чеп им е
Код:
typedef int32_t q31_t

да не говорим за самия int32_t


Сря Окт 29, 2014 12:55 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: cortex-m0/armv6m асемблерски библиотечки
ДедоБоре написа:
и... за къв чеп на някой ще му трябва да брои водещите нулeви битове?


Ми Дедо или съм бил тъп на времето или сега правя простотия да ползвам M0, ама така или иначе в някои драйвери ползвам CLZ. Примерно в STM-а като ми дойде прекъсване трябва да проверя от кои линии, че там gpio-exti lines си ебало мамата. Та да не цикля бит по бит съм ползвал CLZ което за М3/4 е 1 инструкция за 1 клок.
И те така... сега или трябва да си преправям драйверите или да добавя CLZ, ама така или иначе за съвместимост е редно да имам всички стандартни неща. Така че сега първо добавям CLZ и т.н. пък после ще видя дали да оптимизирам местата дето го ползват.

Иначе в CMSIS гледам го ползват при изчисление на "1/x". Което пак поставя същия проблем дето имам аз - дали да се пренапише функцията или не, щото това CLZ някой го е сложил уж за ускорение, а на М0 ще стане забявяне....


Сря Окт 29, 2014 1:05 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение Re: cortex-m0/armv6m асемблерски библиотечки
ДедоБоре написа:
...
и за къв чеп им е
Код:
typedef int32_t q31_t

да не говорим за самия int32_t


Не виждам какъв е проблема !?

Аз често ползвам собственни типове и то точно с цел лесното им предефиниране според платформа, оптимизации и т.н.


Сря Окт 29, 2014 1:19 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение Re: cortex-m0/armv6m асемблерски библиотечки
ползвай си, никой не те спира. ако само ти си четеш кода, може би и ще си го разбираш :D

в случая няма никакъв смисъл да се ползва q31_t вместо, още почвече, че внася неяснота. поне мен ме озадачи какво е q31 и питах гугъла, за да разбера. да, може би има някакъв резон за се полва int32 или uint32, но поне при него няма да се чешеш, където не те сърби.

програмите се четат от хора. на компилатора му все тая. и когато се налага да се ровиш в чужд код, това обикновено е при някаква авария и не си настроен философски, пред камината и чаша хенеси в ръка. пък понякога се налага и сам да си ровиш в твоя код и не би трябвало да ти минават мисли от рода на "кой идиот го е писал ТОВА!"

миро, сори за офтопика.


Сря Окт 29, 2014 1:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение Re: cortex-m0/armv6m асемблерски библиотечки
ДедоБоре написа:
ползвай си, никой не те спира. ако само ти си четеш кода, може би и ще си го разбираш :D
...

Това, че не можеш да схванеш смисъла на нещо - не го прави непременно глупаво и безполезно!

Гледай си хардуера - дано там се оправяш по-добре :)


Сря Окт 29, 2014 1:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: cortex-m0/armv6m асемблерски библиотечки
ps66 написа:

Не виждам какъв е проблема !?


По принцип CLZ трябва да е с unsigned, a не signed параметър. Поне така е дефинирана функцията и инструкцията в останалите курове. Някои компилатори и статик анализатори държат на тия подробности!
Освен това предефинирането на типове трябва да се прави с някаква цел. Безцелното преименуване само прави кода нечетим и води до грешки. Да не говорим. че стандартните функции трябва да са декларирани със стандартни типове. Обратното означава че функцията не е стандартна!

едит: да обобщя:

1. Бъг в алгоритъма
2. Бъг в типа на параметъра
3. Стандартна функция с нестандартен параметър
4. Ненужна смяна на тип
5. Неефективен алгоритъм

колко още неща могат да се объркат във функция от 5 реда?


Сря Окт 29, 2014 1:49 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: cortex-m0/armv6m асемблерски библиотечки
Няма за какво, човек да се хаби ... хакерите всичко са измислили вече:
http://www.hackersdelight.org/hdcodetxt/nlz.c.txt
Има и други интересни алгоритми, полезно ...

_________________
Мразя да мразя ...


Сря Окт 29, 2014 3:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 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


за по-нагледно на Ц изглежда така:
Код:
               uint32_t  tmp;
            
            if( (tmp = (num >> 16)) )
            {
               if( (num = (tmp >> 8)) )
               {
                  return _qclz_table[num];
               } else
               {
                  return _qclz_table[tmp]+8;
               }
            } else
            {
               if( (tmp = (num >> 8)) )
               {
                  return _qclz_table[tmp]+16;
               } else
               {
                  return _qclz_table[num]+24;
               }
            }



и така без таблица
Код:
                  uint32_t res;

            res = 32;
            
            if( num >> 16 )
            {
               num >>= 16;
               res -= 16;
            }
            if( num >> 8 )
            {
               num >>= 8;
               res -= 8;
            }
            if( num >> 4 )
            {
               num >>= 4;
               res -= 4;
            }
            if( num >> 2 )
            {
               num >>= 2;
               res -= 2;
            }
            return res - (num >>1);



Не съм ги тествал още, може да има правописни грешки ;-)


Сря Окт 29, 2014 4:46 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: cortex-m0/armv6m асемблерски библиотечки
В линка не е специфичен х86 код - даже на много от функциите си пише колко инструкции са за RISC ;)
Най оптималното е с таблица и умножение по шантава константа?!
Е на тая скопена Cortex-M нещата са си различни, но виж на АРМ32 със условното изпълнение на инструцкии си е красота да го гледа човек на асемблер ...

_________________
Мразя да мразя ...


Сря Окт 29, 2014 5:02 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Вто Авг 07, 2012 3:16 pm
Мнения: 331
Мнение Re: cortex-m0/armv6m асемблерски библиотечки
Миро, браво за онагледяването.


Сря Окт 29, 2014 6:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Фев 13, 2013 3:35 pm
Мнения: 1803
Мнение Re: cortex-m0/armv6m асемблерски библиотечки
To самото >> 16 се изпълнява за кой знае колко цикъла..
I386+ инструкциите май го имаха вградено търсенето на първият сенат бит? Но и там една инструкция се изпулнява аз колкото водещи нули има такта :)


Съб Ное 01, 2014 2:47 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: cortex-m0/armv6m асемблерски библиотечки
bobihot написа:
To самото >> 16 се изпълнява за кой знае колко цикъла..
I386+ инструкциите май го имаха вградено търсенето на първият сенат бит? Но и там една инструкция се изпулнява аз колкото водещи нули има такта :)


При ARM, всъщност при почти всички RISC шифтването е 1 клок. Останалите куртекси имат броене на водещите нули също за 1 клок и поради тая причина го имам заложено в сорсовете дето сега компилирам за М0.
Другото дето са оптимизирали при М0 и ме мъчи, че за различки от всички останали АРМ-чета не може да комбинира шифт и аритметична/логична операция в 1 клок. Работата с флагове също е много скопена... ама такъв е живота, не може да очакваш супер-дупер за 1$ ;-)


Съб Ное 01, 2014 10:38 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение Re: cortex-m0/armv6m асемблерски библиотечки
miro_atc написа:
ps66 написа:

Не виждам какъв е проблема !?



както винаги цитираш отделни пасажи и почваш да философтваш !

ето го оригиналния ми пост - в него няма нищо към теб:
ps66 написа:
ДедоБоре написа:
...
и за къв чеп им е
Код:
typedef int32_t q31_t

да не говорим за самия int32_t


Не виждам какъв е проблема !?

Аз често ползвам собственни типове и то точно с цел лесното им предефиниране според платформа, оптимизации и т.н.


коментара ми е за това, че :
- само "блондинка програмист" ще тръгне да търси деклация на тип с гугъл (при положение че има сорсовете)!


Съб Ное 01, 2014 1:54 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 33 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 5 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни