Как стать автором
Обновить

Комментарии 27

А зачем собственно проводить такие исследования, если есть замечательный документ: avr-instruction-set-manual, таблицы с 4-2 по 4-6. И никаких таинств.

Или вы нашли несоответствия документа реальному поведению?
Там не плавающей точки, это программная часть.
Это не важно. В конечном итоге все сводится к командам с четко детерминированным поведением. В чем смысл гадать на кофейной гуще, если вам реально важно быстродействие, и есть гарантированный способ узнать причину расхождений?
А не все так просто. Исходники библиотек далеко не все доступны, поэтому рассчитать не удастся, ну не дизассемблировать же. И при чем здесь гадание, если можно запустить программу и увидеть конкретные результаты?
Вообще были получены интересные результаты после отработки методологии измерения. Например, время умножения ФТ 8*8 — 4 такта (в полном соответствии с КД), а 16*16 — не 4*4+4*4=32, как можно было бы ожидать, а около 20, видимо, оптимизации алгоритмов.
А можно уточнить — какие именно ардуино библиотеки недоступны в исходном коде? Ну хотя бы из тех что вас интересуют.
Библиотека операций с ПТ является частью компилятора (в расширенном смысле этго понятия) и в Ардуино никак не входит, хотя используется при линковке. Ее исходников я не видел вообще никогда, не уверен, что они есть помимо ассемблера.
Ардуиновские библиотеки базируются на avr-libc. Исходники можно посмотреть, например, здесь — download.savannah.gnu.org/releases/avr-libc
Плавучку смотреть в libm. И да, она на ассемблере.

PS А вообще, использовать float арифметику на 8-и битных микроконтроллерах — дурной тон. Из того что я видел, подавляющее большинство случаев применения float достаточно легко переносится в целочисленную арифметику.
Достаточно легко для кого? Для меня — да, для Вас — наверное, но для громадного числа пользователей Ардуино — нет. Я об этом пост заканчиваю (о переносе), пытаюсь там обозначить стандартные грабли.

А вот если один из операндов 0, как время сократится относительно ненулевых? Интересно, на этот случай оптимизирована библиотека?

Для первого операнда 0 и 1/170 видимой разницы нет в скорости исполнения нет, видимо, такая оптимизация для сложения не предусмотрена.
Разумеется время вывода в Serial, как и время работы других обработчиков прерываний, добавляется ко времени выполнения теста, и это происходит асинхронно выполнению кода. На время измерения времени работы кода нужно запрещать все прерывания. А Arduino и для отсчёта времени (micros/millis) использует прерывания. Т.е. для теста нужно измерять время не силами Arduino, а извне.
Ну я вроде как показал, что можно аккуратно померить и силами Ардуино, это и была цель.
Хотите точно померять время силами Ардуино?
— Останавливаете Timer1
— Сбрасываете его в 0
— Запрещаете прерывания
— Запускаете Timer1 в Normal mode с делителем = 1
— Выполняете операцию
— считваете Timer1
— Разрешаете прерывания
Это уже не силами Ардуино, если мы вкладываем в это понятие использование определенных библиотек. Хотя я тоже довольно таки в своем решении от «чистой» Ардуино удалился.
Ардуино это физическое устройство. Если вы " вкладываете в это понятие использование определенных библиотек" то для избежания неоднозначностей надо говорить не «с помощью ардуино», а «с помощью ардуиновских библиотек»
А то что тактовый сигнал имеет джиттер, имеет влияние на ваши наблюдения?
маловероятно, на фоне общей погрешности он просто неразличим
Так таймеры же работают от того же тактового сигнала. Так что от джиттера «попугаи» не зависят даже если он и значителен.

Что-то мне всё это напоминает.
Фам Нювен несколько лет провел, обучаясь программировать и исследовать. Программирование восходило к началу времен. Как та навозная куча за замком отца. Когда ее промыло ручьем на десять метров в глубь, обнаружились искореженные корпуса машин – летающих машин, как говорили крестьяне, еще от тех великих дней колонизации Канберры. Но та навозная куча была чистой и свежей по сравнению с тем, что лежало в локальной сети «Репризы». Были программы, написанные пять тысяч лет назад, когда человечество еще не покинуло Землю. И самое чудесное (самое ужасное, как говорила Сура) было то, что, в отличие от бесполезных обломков прошлого Канберры, эти программы все еще работали! И через миллион миллионов запутанных нитей наследования многие из старейших программ все еще выполнялись во внутренностях системы Кенг Хо. Например, методы слежения за временем у торговцев. Поправки вносились неимоверно сложно – но на самом дне лежала крошечная программа, которая гоняла счетчик. Секунду за секундой отсчитывала система Кенг Хо с того момента, как нога человек ступила на Луну Старой Земли. Но если приглядеться еще пристальнее… начальный момент был миллионов на сотню секунд позже; момент «ноль» одной из первых компьютерных операционных систем Человечества.
Значит, под всеми интерфейсами верхнего уровня лежат уровни поддержки, слой на слое. Какая-то часть этих программ была создана для совершенно иных ситуаций. То и дело несоответствие рождало фатальные инциденты. Вопреки всей романтике космических полетов, чаще всего катастрофы вызывались древними забытыми программами, которым удавалось взять реванш.
Вернор Виндж «Глубина в небе». Спасибо, теперь я знаю, что почитать.
Почему нельзя было использовать Keil или IAR, без неизвестных библиотек и написать код вычисления и замера времени самостоятельно? В Arduino обычный микроконтроллер, который можно программировать средствами для микроконтроллеров, а не только высокоуровневой Arduino Studio.
Потому, что на рассматриваемом сайте для моделирования реализована только поддержка Ардуино среды программирования, а так, если в общем случае, конечно, можно.
муть какая-то
хотите получить реальный asm — укажите соответствующий ключ компилятора. приведенный онлайн-сервис, выдаст примерный код, не учитывающий конкретные настройки, например оптимизацию.

для замеров времени имеет смысл использовать логический анализатор

о каких замерах времени вообще может идти речь, когда используется программный float?
замеры нужны, когда требуется оптимизация. но оптимизация и программный float — взаимоисключающие технологии
0. Это не муть а способ получения вменяемых данных при существующих ограничениях.
1. Для начала попробуйте зайти на упомянутый сайт и указать ключ компиляции, а мы посмеемся.
2. Может быть, Вы вообще не читали статью, там идет речь о программной эмуляции, расскажите, как подключить к ней логический анализатор.
3. А что, время исполнения подпрограмм замерять нельзя?
4. Ну если Вы знаете способы считать Float на МК без поддержки операций ПТ каким либо иным способом, кроме программной реализации, поделитесь.
5. А оптимизация вполне себе возможна во всех режимах, кроме способа «выкиньте свой МК и поставьте мощный» есть и другие.
0. Ограничения вы придумали сами
1. Не вижу смысла измерять скорость сферического коня в вакууме.
2. Прочитал. См. п.2.
3. Можно. Иногда — нужно. Иногда даже имеет смысл использовать моделирование/эмулирование (но к Ардуино это не имеет отношения). При этом если есть потребность соизмерять производительность с физическими процессами — то и замеры должны быть реальными. Иначе — см. п.1.
4. Представьте себе — есть методики замены float:
  • операции с фиксированной запятой — если вам нужна точность в два знака после запятой — просто оперируйте значениями сотых долей. Вы же обходитесь микро/миллисекундами для оценки секунд, без всякого float.
  • целочисленные алгоритмы

5. Точно! И первое что надо сделать при оптимизации — отказаться от float
Предлагаю Вам реализовать в рамках пункта 5 оптимизацию решения нетривиальной системы дифференциальных уравнений — интересно посмотреть.
не вопрос
Но только после того, как вы приведете реальный практический пример необходимости таких вычислений, при использовании платформы Ардуино в условиях, когда требуется решение таких систем за ограниченное время.

т.е. задача должна стоять так:
  • описание процесса
  • система уравнений
  • критичное время
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории