Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Допустимо ли объявлять 16 регистровых переменных
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
sigmaN
Есть у меня друг один, мы с нем вечно холливары устраиваем..
На тему оптимизации и вообще даже IOS vs Android можем обсудить biggrin.gif

В общем в этот раз лень мне с ним спорить сильно и я решил сразу коллективный разум подключить, чтоб было убедительнее..
Ну и для поиска истины, конечно же.

Его идея состоит в том, что на XMEGA регистров аж 32шт и около 16ти из них
вполне допустимо забиндить сразу напеременные чтобы(цитирую)"не было задержек при обращении к памяти".
Переменные эти у него глобальные, часто такие, которые используются одновременно и в прерыванииях и за их пределами.
Т.е. это такая своеобразная альтернатива volatile получается..

Я же утверждаю, что подобное "уменьшение задержек при обращении к памяти" чревато тем, что в других местах оптимизатор, с подрезанными на 16 регистров крыльями, будет выкручиваться как придется, генеря не самый оптимальный код.

Отметим, что разрабатывает он не супер-пупер риалтаймовую систему, а вполне себе многофункциональный прибор с граф.дисплеем, кнопочками, радиомодулями и прочими далекими от риалтайма или интенсивных вычислений фичами...

Как вы считаете, стоит ему научитсья к месту применить volatile?
В своих проектах часто ли вы объявляете регистровые переменные?
Я, например, ни разу не прибегал к такому. Нет, пробовал конечно, но так чтобы вот действительно была в этом необходимость - не было случаев пока.
Кажется регистровые переменные это чуть ли не отголосок прошлого, когда Си компиляторы почти не умели оптимизировать и приходилось как-то выкручиваться....
alexeyv
А как Вы объявляете/резервируете эти регистры под переменные?
Если с помощью "register", то это всего лишь "просьба" компилятору поместить переменную в регистр, и не факт что компилятор это исполнит.
Если с помощью прагм компилятора (что то типа __regvar+@ в IAR или asm("r3") в AVR GCC), то у компилятора есть ограничения по размещению, например, регистры ниже r16 исключая r0 и r1. И тут не получится разместить 16 регистров - только 14.
Я старался расположить все/большинство переменных в регистрах когда работал на ассеблере. При переходе на Си первое время пытался таким образом "соптимизировать" свои программы, но реального улучшения не видел. Единственный случай объявить переменную в регистре - для уменьшения времени прерывания, в котором она используется. Количество таких переменных не стоит делать большим - компилятор будет хуже оптимизировать, например, при недостатке рабочих регистров, они будут сохраняться в стек - в результате будет увеличен размер используемого стека (а это грозит выходом за границу) и дополнительными push/pop, которые сведут на нет скорость работы, якобы увеличившуюся за счет помещения переменной в регистр.

Пы.Сы.
надо развивать алгоритмическую оптимизцию, а не надеяться на "волшебные" команды/директивы компилятора. А для этого надо учится, учится и учится... А также опыт, опыт, опыт....
Мне нравится решать разные задачки на оптимизацию. Например, как поменять содержимое двух регистров не используя другие регистры/память?
demiurg_spb
2ТС: Однозначного ответа тут быть не может. Если проект более-менее крупный, то потеря занятых под переменные регистров действительно может плохо сказаться на общем размере прошивки.
Я считаю, что должны быть 100% аргументированные доводы за использование такой техники. Если это блажь - то грош цена такому программисту, ибо вся эта муть не добавляет прозрачности понимания сути идеи, реализованной в программе.
Цитата(alexeyv @ Nov 12 2014, 09:44) *
надо развивать алгоритмическую оптимизцию, а не надеяться на "волшебные" команды/директивы компилятора.
Одно другому не мешает. Например, использование LTO в gcc проектах даёт гарантированный результат с точки зрения "уплотнения" когда.
Поэтому свой инструментарий обязательно стоит изучать и грамотно использовать.
Ну а на счёт волшебных опций компилятора, так это они лишь сначала для Вас могут казаться волшебными, а как разберётесь что да как - сразу всё волшебство станет реальностью.
sigmaN
Цитата
Например, как поменять содержимое двух регистров не используя другие регистры/память?

ну можно XCHG ax,cx wink.gif
предлагается универсальный метод или конкретно на avr?

на ум приходит какой-нибудь 16ти битный ROR на 8 бит, но я не уверен что авр умеет крутить регистровую пару...
так что это интересный вопрос однако)
alexeyv
Цитата
Ну а на счёт волшебных опций компилятора, так это они лишь сначала для Вас могут казаться волшебными, а как разберётесь что да как - сразу всё волшебство станет реальностью.

Согласен, используемые инструменты надо изучать и грамотно ими пользоваться. Я имел ввиду ситуацию когда узнав одну "фичу" компилятора, начинается необдуманное её использование везде где можно с мыслью "авось поможет!".

Цитата
предлагается универсальный метод или конкретно на avr?

Универсальный, с записью на языке СИ. Ассемблеров куча и у каждого свои фишки.

Цитата
Ну а на счёт волшебных опций компилятора, так это они лишь сначала для Вас могут казаться волшебными, а как разберётесь что да как - сразу всё волшебство станет реальностью.

Согласен, используемые инструменты надо изучать и грамотно ими пользоваться. Я имел ввиду ситуацию когда узнав одну "фичу" компилятора, начинается необдуманное её использование везде где можно с мыслью "авось поможет!".

Цитата
предлагается универсальный метод или конкретно на avr?

Универсальный, с записью на языке СИ. Ассемблеров куча и у каждого свои фишки.
Палыч
Цитата(sigmaN @ Nov 13 2014, 00:09) *
это интересный вопрос однако

Разве? Ответ давно известен...
CrimsonPig
Цитата(sigmaN @ Nov 11 2014, 21:22) *
Есть у меня друг один, мы с нем вечно холливары устраиваем..
На тему оптимизации и вообще даже IOS vs Android можем обсудить biggrin.gif


Для доморощенных "оптимизаторов" есть несколько правил, которым желательно следовать:
- "premature optimisation is a root of all evil" ©
- не надо пытаться быть умнее хорошего оптимизирующего компилятора.

..я как-то пытался выяснить по ассемблерному листингу (ARM), что будет эффективнее,
var & 0xFFFFFF00 или (var >>8)<<8 (простейший пример), так компилятор в обоих случаях генерил
абсолютно одинаковый код по своему разумению sm.gif

Те же битхаки (типа обмена переменных через xor) могут оказаться далеко не самыми эффективными. Все может
сильно зависеть от архитектуры процессора и прочих вещей.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.