Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Оптимизация встраивания функций
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
neiver
Доброго всем времени суток.

Имеется чистая функция - принимает один целочисленный параметр и возвращает результат, который зависит только от этого параметра. Никаких побочных эффектов - казалось-бы идеальный кандидат для встраивания. В большинстве случаев в эту функцию передаются константные параметры и редко переменные. Хочется, чтобы при передаче константного параметра, функция встраивалась и выполнялась константная подстановка (вызов функции заменялся вычисленным во время компиляции значением), а при передачи переменной происходил честный вызов функции. Компиляторы семейства GCC именно так и делают. Компиляторы IAR ведут себя по другому: если функция вызывается с константными параметрами больше определённого порогового числа раз, то компилятор генерирует тело этой функции и перестаёт её встраивать везде, даже где это выгодно. #pragma inline=forced помогает не сильно, так как функция встраивается всегда, в том числе при переменных аргументах, когда это не выгодно. Иными словами, функция или всегда встраивается, или всегда вызывается. GCC, как я уже говорил принимает решение о встраивании функции для каждого ее упоминаия в исходном тексте.

Кто-нибудь знает как добиться желаемого поведения от компиляторов IAR?

Всё описанное справедливо, вероятно, для всех компиляторов семейства IAR. По крайней мере, для платформ ARM, AVR & MSP430.
vmp
А если функцию описать как static, чтобы компилятор знал, что это локальная функция и из других файлов вызываться не будет?
MrYuran
То есть, вы хотите, чтобы одна и та же функция либо встраивалась, либо нет в зависимости от контекста?
Первый раз о таком слышу.
Или я неправильно понял?
Xenia
Цитата(vmp @ Dec 21 2010, 14:17) *
А если функцию описать как static, чтобы компилятор знал, что это локальная функция и из других файлов вызываться не будет?

Это не поможет. Компилятор не обязан вычислять значения функций. Например, даже если вы запишите sin(0.5), то не ожидайте, что компилятор станет вычислять синус в момент компиляции. Функция, она функция и есть.

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

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

Код
#define func(x)      2*(x)*(x)+4*(x)-6

тогда это действительно будет всегда прямая подстановка, и если x окажется константой, то компилятор вычислит всё выражение func во время компиляции.
demiurg_spb
Цитата(MrYuran @ Dec 21 2010, 14:20) *
То есть, вы хотите, чтобы одна и та же функция либо встраивалась, либо нет в зависимости от контекста?
А почему бы и нет?

Цитата(Xenia @ Dec 21 2010, 14:33) *
Это не поможет. Компилятор не обязан вычислять значения функций. Например, даже если вы запишите sin(0.5), то не ожидайте, что компилятор станет вычислять синус в момент компилляции. Функция, он функция и есть.
Это можно ожидать. Многие компиляторы так давненько поступают.
Это из оперы:
http://en.wikipedia.org/wiki/Constant_folding
Xenia
Цитата(demiurg_spb @ Dec 21 2010, 14:48) *
Это можно ожидать. Многие компиляторы так давненько поступают.
Это из оперы:
http://en.wikipedia.org/wiki/Constant_folding

А не факт, что IAR того же не умеет. Многое зависит от установок оптимизации, тогда как топикстартер молчит об этих установках, как рыб sm.gif.

neiver
Цитата(Xenia @ Dec 21 2010, 14:33) *
А если вам нужно, чтобы тело функции вычислялось в момент компиляции, тогда используйте не функцию, а дефайн. Например так:

#define func(x) 2*(x)*(x)+4*(x)-6

тогда это действительно будет всегда прямая подстановка, и если x окажется константой, то компилятор вычислит всё выражение func во время компиляции.

Нет, дефайн даст тот-же результат, что и функция + #pragma inline=forced. Только функция в данном случае всё равно лучше.

Цитата(Xenia @ Dec 21 2010, 14:57) *
А не факт, что IAR того же не умеет. Многое зависит от установок оптимизации, тогда как топикстартер молчит об этих установках, как рыб sm.gif.

Различные установки оптимизации не дают желаемого результата - функция либо всегда встраивается, либо всегда нет, не зависимо от контекста её вызова.
Сергей Борщ
QUOTE (neiver @ Dec 21 2010, 14:06) *
Различные установки оптимизации не дают желаемого результата - функция либо всегда встраивается, либо всегда нет, не зависимо от контекста её вызова.
Напишите две идентичные функции - одну встраиваемую, вторую нет, с пометкой "Специально для ИАРа". И вызывайте по контексту ту или другую.
Dog Pawlowa
Цитата(Сергей Борщ @ Dec 21 2010, 17:37) *
Напишите две идентичные функции

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


Цитата(Xenia @ Dec 21 2010, 14:57) *
... тогда как топикстартер молчит об этих установках...

Кстати да. Зачем то ИАР сделал выбор оптимизации по скорости/размеру/баланс.
Дык какой режим тестировал топикстартер?
А?! wink.gif
sergeeff
Я как-то писал с цитатами из какой-то книги, кажется Александреску, что в современных компиляторах даже обычная функция может быть им (компилятором) подставлена и наоборот, inline функция вызываться. Это отдано на откуп разработчикам компиляторов/оптимизаторов/линкеров.
scifi
Цитата(sergeeff @ Dec 22 2010, 00:04) *
Я как-то писал с цитатами из какой-то книги, кажется Александреску, что в современных компиляторах даже обычная функция может быть им (компилятором) подставлена и наоборот, inline функция вызываться. Это отдано на откуп разработчикам компиляторов/оптимизаторов/линкеров.

Я бы сказал больше: зачем пытаться заставить компилятор генерить код с узко-специальной непонятной фенечкой?
Код генерит без глюков? Хорошо. Если нет - пишем bug report куда надо.
Скорости хватает? Хорошо. Если нет - оптизируем.
Dog Pawlowa
Цитата(scifi @ Dec 22 2010, 00:56) *
зачем пытаться заставить компилятор генерить код с узко-специальной ...

Ну, тут вопрос вполне адекватен, касается поведения компилятора при задании высокого уровня оптимизации.
Я тоже рассчитываю на определенное упрощения кода при оптимизации и тоже портирую между IAR и GCC.
Правда, не рассчитываю на расчет функций на этапе компиляции.
Мечтам нужно подрезать крылья wink.gif
jorikdima
Цитата(Xenia @ Dec 21 2010, 14:57) *
А не факт, что IAR того же не умеет. Многое зависит от установок оптимизации, тогда как топикстартер молчит об этих установках, как рыб sm.gif.

библиотечная функция IAR strlen для MSP430 умеет встраиваться в виде результата работы функции для константного аргумента.
neiver
Я решил не полагаться на "умность" компилятьоров. Сделал одну обычную функцию и шаблон, который принимает константный аргумент и гарантированно производит вычисления на этапе компиляции.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.