|
|
  |
К вопросу об оптимизации инлайн-ассемблера., Не всё так шоколадно... |
|
|
|
Oct 25 2009, 12:49
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Я много раз читал, что инлайн-ассемблер в gcc замечательно оптимизируется. Да и глядя в дизассемблер, убеждался, что это так и есть. Но недавно наткнулся на материал про встроенные функции GCC, и решил их испытать. Заменил на пробу Код INLINE inline byte GetHighPriority(TProcessMap pm) { dword clzero; asm ("clz\t%0, %1": "=r" (clzero): "r" (pm)); return (31 - clzero); } на Код INLINE inline byte GetHighPriority(TProcessMap pm) { return (31 - __builtin_clz(pm)); } Собственно код, генерируемый компилятором для этой функции - не поменялся. Но. Размер проекта уменьшился на 40 байт. Это для пяти вызовов данной функции. Это конечно мелочи для проекта на 16 Кб, но тем не менее. Насколько я понял по листингу, при использовании __builtin_clz() компилятор несколько более оптимально перетасовывает окружающие куски кода. Собственно, вывод мой таков - несмотря на отличную оптимизацию встроенного ассемблера, компилятор не может (или не хочет) применять к нему все возможные методы оптимизации. Возможно, этот вывод поспешен, потому прошу тех, кто придумает куда можно применить вышеуказанные встроенные функции применить их, и рассказать о результатах
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 26 2009, 15:33
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(klen @ Oct 26 2009, 14:09)  я всегда думал что инлайн асм вставки для того и придуманы чтоб компиллер их ни прикаких обстоятельствах не трогал Компилер волен выбирать регистры из указанных в параметрах асм-вставки. И выбрасывать ненужные по его мнению команды. То есть, на самом деле поле деятельности для оптимизации имеется, и немалое. Цитата эффект о котором Вы говорите скорее всего никак с оптимизацией не связан, я думаю что тут или при линковке чето прилезло или атрибуты у функции __builtin_clz какието такие что заставляют компиллер или линкер делать доп теложвижения, ну например распологать ее в адресном пространстве с хитрым выравниванием или стек для нее както хитро выделить. Нет, ничего такого. Это инлайн-функция, и код самой функции получается одинаковый с точностью до регистров. То есть, полностью идентичный. Но обрамляющая функция (та, в которую вставляется наша инлайн-функция) - компилится чуть оптимальнее. ------ Посмотрел повнимательнее. Я был не прав  Вся экономия произошла от того, что при употреблении __builtin_clz() компилер постеснялся заинлайнить одну функцию, содержащую вызов моей инлайн-функции. А при использовании встроенного ассемблера - заинлайнил. То есть, похоже, вся разница в том, что __builtin_clz() добавляет к уровню вложенности вызовов ещё один уровень.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 27 2009, 11:41
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
Цитата(GetSmart @ Oct 27 2009, 14:35)  Нда... Оптимизаторы... Если программист поставил asm("nop") значит она реально нужна, не для того чтобы "вундеркинд-компилятор" (или вундеркинд-разработчик компилятора?) её выкинул. Довольно странно в GCC выглядит сочетание volatile asm("nop"), причём IAR такое сочетание не переваривает. стоп стоп стоп!!! видимо не все ПООНИМАЕМ ЧТО РАБОТЕТ ВСЕ ПРАВИЛЬНО! если написать asm("nop") - то это явно ненужная штука - она ничего не делает. а вот volatile asm("nop") - это очень даже много делает!!! компиллеру ясно показано что трогать НИЗЗЯЯЯ, программер не тупой и не с дуру это вписал. таким образом гибко обеспечивается сочетание оптизации и кусков кода за который отвечать будет исключительно программист. теперь наверно "ОПЯТЬ ВСЕ ПОНИМАЕМ ПРАВИЛЬНО"  сколько живу стока убеждаюсь - учебник по С для embedded нада начинать с главы про VOLATILE, а уж потом про оператры, переменные, функции и всякие там языковый конструкции. Это просто поразительно!  чем проще вещи тем сложнее понять ... это все РС виноваты - "у них" нет прерываний, как многие считаю. за том есть Windows и те кого на ней "учили программить". Вопрос на засыпку. я вот фортранчиком не брезгую оформить куски счетные на stm32f103 а кто его вообще умеет ?  наверно профессиональным программером не стать никому - жизни не хватит, а нам инженерам для кого програмирование всего лиш маленький шажок к цели - рабочий девайс, и подавно. остапа понесло.... слово volatile для меня как валерьянка для кота... топорщит
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|