Программирование без ветвления на ардуино

Я изучил программирование без ветвлений, чтобы ускорить код, и мне любопытно, как именно Arduino (или, скорее, atmega328) на самом деле читает машинные инструкции. Есть ли у него кэш-память или он считывает каждую инструкцию из флэш-памяти?

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

Мой вопрос: относится ли это к atmega328? Если он читает каждую инструкцию прямо из флэш-памяти без использования кеша, то не должно иметь большого значения, если ему придется переходить к инструкциям, верно?

, 👍2

Обсуждение

нет кеша... нет загрузки инструкций во время выполнения... вы бы сэкономили немного времени на каждой устраненной инструкции перехода... так что, если вы запускаете скетч осциллографа, то запускайте встроенный код от начала до конца, @jsotola

Даже inline - это всего лишь предложение, хотя правильно, и компилятор может делать все, что ему заблагорассудится? Вы также должны скомпилировать с уровнем оптимизации -O3 для скорости вместо -Os для размера., @Gabriel Staples

@Beacon of Wierd, опубликуйте это также на https://www.avrfreaks.net/, чтобы узнать, что они говорят, и дайте нам ссылку на это здесь. Я хотел бы знать, и я полагаю, что там гораздо больше экспертов низкого уровня и продвинутых пользователей AVR., @Gabriel Staples

Branchless не имеет большого смысла для AVR. Я бы посоветовал научиться читать ассемблерный код, сгенерированный компилятором (avr-objdump -S <имя файла>.elf). Затем сравните разные версии ваших алгоритмов друг с другом. Мне нравится использовать wdt_reset(), чтобы добавить маркер перед определенным разделом, который меня интересует. Затем в ассемблере найдите инструкцию wdr., @Gerben


1 ответ


4

Кэша нет, так что вам не о чем беспокоиться. Все инструкции извлекаются непосредственно из флэш-памяти и немедленно выполняются.

Тем не менее, существует двухэтапный конвейер. Это означает, что за один такт из флэш-памяти извлекается инструкция, а в следующем такте она выполняется, и пока она выполняется, следующая инструкция загружается в готовности.

Это означает, что при возникновении ветвления, поскольку AVR использует очень-очень упрощенный подход к прогнозированию ветвлений (т. е. он предполагает, что ветвь не будет выполнена, и просто загружает следующую инструкцию, независимо от этого), он должен отбросить содержимое конвейер и начать с нуля.

Это всего один штрафной такт, пока загружается инструкция с новым ответвлением, но это все же штраф.

Кэш необходим только в том случае, если ядро ЦП работает быстрее, чем можно получить доступ к памяти. Поскольку AVR работает только на частоте до 20 МГц, что значительно медленнее, чем доступ к флэш-памяти, поэтому добавление кэша было бы совершенно бессмысленным. Другие более быстрые MCU используют кэширование, например PIC32MZ с тактовой частотой 200 МГц, поскольку в противном случае «состояния ожидания» не будут выполняться. нужно было бы ввести, чтобы замедлить чтение из флэш-памяти.

,