Вопрос новичка о типах данных «короткие» и «Uint16_T»

Кенласли
Ср 22 ноября 2017 г. 18:41
Привет

Я пытаюсь сделать свой код как можно быстрее на своей недавно купленной синей таблетке.
Я размышлял . . .

Поскольку CPU является 32-разрядным устройством, существует ли какое-либо конкретное преимущество скорости (или другое возможное преимущество) использования типов данных «Short» и «uint16_t», которые используют два байта вместо четырех, пожалуйста? Математика с этими меньшими типами данных будет более быстрее на этих 32-разрядных устройствах?

Спасибо
Кен

П.С. Я сделал поиск в Google, а также искал этот форум, но не смог найти ответ.

Rogerclark
Ср 22 ноября 2017 г., 19:40
Компилятор делает всевозможные уловки, чтобы улучшить скорость или размер кода, поэтому единственный способ узнать, будет ли изменение на 16 -битное.

Я предполагаю, что вы не будете ускорить ситуацию, но можете сэкономить какую -то баран

В моем ядре Arduno-STM32 существует оптимизированное меню опции, которое будет иметь большее влияние.

Оптимизация по умолчанию для “размер” -ОС, но это, вероятно, самая медленная настройка.
Попробуйте настройки -O2 или -O3, с LTO или без LTO (оптимизация времени ссылки), и вы обнаружите, что -O3, вероятно, самый быстрый.
Я считаю, что LTO иногда может усугубить ситуацию.

Обратите внимание, что у нас есть предупреждения при использовании -O3, но ядро ​​обычно все еще работает нормально

Кенласли
Ср 22 ноября 2017 г., 19:54
Привет, Роджер - я ценю ваш ответ.

Я только что провел несколько тестов, изменив несколько «шорт» на «int».
Я не нашел преимущества скорости для использования меньших типов данных.
На самом деле, мой код работал почти на одинаковой скорости.

Так что никакого преимущества вообще (в моем случае).

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

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

Кен

Rogerclark
Ср 22 ноября 2017 г. 20:02
На плаваниях F1 и удваивании будут медленнее, поскольку у него нет FPU

F4 имеет FPU, поэтому скорость будет почти идентичной для Int и Float

Попробуйте настройку оптимизации -O3, вы, вероятно, заметите достойное увеличение скорости

Лично я бы предпочел, если бы по умолчанию было -O2, но представление об сообществе заключается в том, что они предпочитают опцию оптимизации для размера, который является самым медленным.

Кенласли
Ср 22 ноября 2017 г. 20:13
Привет снова Роджер

Видимо, я не использовал ваше ядро ​​(или ваше последнее ядро).
Я загрузил файлы и поместил их в нужном месте, перезапустил Arduino IDE, и теперь я вижу «оптимизацию» в раскрывающемся меню «Инструменты».
Большой!

Я быстро получу чаевые (и время), и сообщу.

Кен

Кенласли
Ср 22 ноября 2017 г. 20:19
Оптимизация моего маленького эскиза (который теперь вообще не использует поплавок).

Наименьший (стандартный) - 30.2 микросекунд
-01 Настройка - 31.4 микросекунд (медленнее!)
-02 Настройка - 29.5 микросекунд
-03 Настройка -29.6 микросекунд.
-03 с LTO -25.8 микросекунд (сладкие!!!!)

Спасибо за это - это может показаться не большой разницей, но я могу добавить еще немного математики, и, как девиз Tesco «Каждое маленькое помогает».

Кен

Rogerclark
Ср 22 ноября 2017 г. 20:22
ХОРОШО

Некоторые вещи намного быстрее с настройками более высокой оптимизации, но ваш код может быть уже довольно хорошо оптимизирован

Дэйв Дж
Ср 22 ноября 2017 г. 20:37
F4 (и F3) используйте ядро ​​ARM M4, которое имеет 16 -битные инструкции SIMD, и поэтому может ускорить 16 -битную арифметику. Я не думаю, что GCC поддерживает эти инструкции, поэтому вы должны использовать их через внутреннюю или ассемблер. Это не поможет вам, потому что в ядре F1 M3 их нет.

С точки зрения использования 16 -битных типов данных для ускорения вещей, самая легкая вещь, которую можно найти, - это искать, где вы копируете данные - перемещение по 32 бита за раз быстрее, чем 2x16 битов. Посмотрите на периферическую документацию, чтобы увидеть, есть ли у периферийных устройств, которые могут помочь (E.глин. Двойной режим для передачи АЦП).

Помимо этого, нужно посмотреть, сможете ли вы обработать две вещи одновременно - <32 -битное значение> & 0xfff0fff0 быстрее, чем два x <16 -битное значение> & 0xfff0.

Если вы знаете диапазон значений, которые вы будете использовать, не вызовут проблемы, вы можете иногда уйти с лечением 32 -битного значения как два 16 -битных. эн.глин. Если ваши входные данные гарантированно составит 14 бит без знака, вы можете умножить два значения на 2 за раз, используя <32 -битное значение> << 1.

Rogerclark
Ср 22 ноября 2017 г. 20:46
Кен,

Вы можете опубликовать свой код и попросить людей о предложениях, чтобы ускорить его.

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

Кенласли
Пт 24 ноября 2017 г. 12:08
Разместите код? Я мог бы просто сделать это . . . :)
Это в значительной степени оптимизировано, но это может сделать с помощью экспертных глаз.
Посмотрим, что приносит эти выходные.

Кен

Rogerclark
Пт 24 ноября 2017 г., 4:32
Не беспокойся

Кто -то может заметить оптимизацию...