реклама на сайте
подробности

 
 
> Keil, оптимизация математики, почему так и что делать?
demiurg_spb
сообщение Apr 29 2011, 08:32
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Опции компиляции:
Код
--feedback ".\obj\xxxx.fed" -c --cpu Cortex-M3 -D__MICROLIB  -g -O3 -Otime --apcs=interwork --split_sections --asm --interleave --C99  --asm --interleave -I "C:\Keil\\ARM\INC" -I

Пример:
Код
float func(float x)
{
    return (x*pow(0.1, 0.01));
}

Этот негодяй прилинковывает функцию pow и по ходу дела считает её в рантайме, а не на этапе компиляции.
С gcc таких сюрпризов не припоминаю.
Есть идеи куда копать?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
scifi
сообщение Apr 29 2011, 09:22
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(demiurg_spb @ Apr 29 2011, 12:32) *
Этот негодяй прилинковывает функцию pow и по ходу дела считает её в рантайме, а не на этапе компиляции.

С более чем 10 годами опыта программирования на Си я всегда считал, что иначе и быть не может.

Цитата(demiurg_spb @ Apr 29 2011, 12:32) *
С gcc таких сюрпризов не припоминаю.

GCC вычисляет это на этапе компиляции? Если это правда, моё мнение о GCC резко улучшается :-)

Цитата(demiurg_spb @ Apr 29 2011, 12:32) *
Есть идеи куда копать?

Конечно.
return x * 0.97723722f;
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 29 2011, 10:39
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(scifi @ Apr 29 2011, 13:22) *
С более чем 10 годами опыта программирования на Си...

Ну мы с Вами по этому параметру близнецы братья:-), но я по большей части всё это время сидел под GCC.
Цитата
GCC вычисляет это на этапе компиляции? Если это правда, моё мнение о GCC резко улучшается :-)
А что тут странного?
constant propagation - уже сто лет в обед.
Цитата
return x * 0.97723722f;
Так и сделано сейчас, но это не удобно, т.к. это число должно зависеть от задефайненого значения. Некрасиво....
(грубо это коэффициент фильтра, зависящий от ADC_SMP_RATE, который должен пересчитываться на этапе компиляции.
а ADC_SMP_RATE - любое целое положительное число>0)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 29 2011, 12:22
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(demiurg_spb @ Apr 29 2011, 14:39) *
constant propagation - уже сто лет в обед.

Обычно constant propagation ничего не знает про функции. А gcc постарался - молодцы.

Цитата(demiurg_spb @ Apr 29 2011, 14:39) *
Так и сделано сейчас, но это не удобно, т.к. это число должно зависеть от задефайненого значения. Некрасиво....
(грубо это коэффициент фильтра, зависящий от ADC_SMP_RATE, который должен пересчитываться на этапе компиляции.
а ADC_SMP_RATE - любое целое положительное число>0)

Ну, можно прикрутить костыль: assert(проверить, что значения двух констант согласованы). Тогда если изменили одну константу, но забыли подправить другую, это вылезет на этапе отладки. Другие варианты тоже так себе: внешний скрипт для генерации констант, инициализация константы в ОЗУ при старте программы.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 29 2011, 13:32
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(scifi @ Apr 29 2011, 15:22) *
Ну, можно прикрутить костыль: assert(проверить, что значения двух констант согласованы).

А вот assert как раз работает на этапе run-time, нет?
А проверять при компиляции - только #if ... #error. Правильно?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 29 2011, 14:23
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ViKo @ Apr 29 2011, 17:32) *
А вот assert как раз работает на этапе run-time, нет?

Да. Но когда определён макрос NDEBUG, как это полагается делать при сборке окончательной версии, все assert() пропадают.

Цитата(ViKo @ Apr 29 2011, 17:32) *
А проверять при компиляции - только #if ... #error. Правильно?

Нет, не только. Ещё assert_static().
Только возведение дробных чисел в дробную степень на стадии компиляции - это проблема.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 20:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016