Jump to content

    
Sign in to follow this  
haker_fox

IAR 8.40.1, директива __forceinline

Recommended Posts

Добейтесь компиляции без ошибок с обычным inline. Потом уже добавляйте __forceinline.

Попробуйте сделать:

1. Объявите метод класса без inline.

2. Перед определением поставьте inline.

3. Определение встраиваемых методов класса должно располагаться в файле хидера класса, т.е. в одном файле с их объявлением, после объявления самого класса. Это обязательное условие. Без него компилятор будет выдавать ошибку.

Share this post


Link to post
Share on other sites
6 hours ago, Darth Vader said:

Добейтесь компиляции без ошибок с обычным inline.

С ней ошибок нет, не было и не будет, надеюсь)

Моя версия компилятора упорно не переваривает __forceinline. Ну и ладно. У меня уже интерес к этому пропал. И так понятно, что код нужно писать таким образом, чтобы компилятор безо всяких пренуждений оптимизировал код самостоятельно.

Share this post


Link to post
Share on other sites
4 часа назад, haker_fox сказал:

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

....или писать на асме. :wink:  У меня вот сейчас в текущем проекте при компиляции с оптимизацией "Medium" загрузка процессора примерно такая-же (33-34%) как при оптимизации "High-Balanced". На "Medium" даже чуть меньше (~1% разницы). IAR_7.80.4. Почему бы это?... :wink:

Share this post


Link to post
Share on other sites
10 minutes ago, jcxz said:

....или писать на асме.

В принципе я бы попробовал. Но мои коллеги не поймут. В прямом и переносном смысле)

Share this post


Link to post
Share on other sites
34 минуты назад, jcxz сказал:

или писать на асме

Это только усложняет оптимизацию.

 

35 минут назад, jcxz сказал:

Почему бы это?...

Факторов влияющих на оптимизацию много. Почему такое в вашем проекте происходит автору виднее.

Share this post


Link to post
Share on other sites
2 minutes ago, VladislavS said:

Это только усложняет оптимизацию.

Только компилятору. Но если нужен супер-супер быстрый алгоритм в прерывании, то компилятор не сможет использовать, например SIMD-команды. Нужны либо специальные либы, либо писать ручками. Может быть и на асме, учитывая все тонкости и нюансы. Как раз на столе система сбора данных лежит. Прерывания тикают каждые 50 мкс, нужно делать "кучу" математики с float, параллельно работает сетевой стек и что-то ещё (уже забыл). То-ли хреново пишу, то-ли действительно нужно оптимизировать. Но иногда всё это не успевает работать(((((((((((((

Share this post


Link to post
Share on other sites
28 минут назад, haker_fox сказал:

В принципе я бы попробовал. Но мои коллеги не поймут.

Случаи когда реально нужно вмешательство asm можно на пальцах пересчитать. Сделать сколь-либо серьёзный проект на asm лучше чем на ЯВУ ой как непросто. Компилятор ЯВУ оптимизирует без устали.

2 минуты назад, haker_fox сказал:

компилятор не сможет использовать, например SIMD-команды

Почему?

Share this post


Link to post
Share on other sites
3 minutes ago, VladislavS said:

Компилятор ЯВУ оптимизирует без устали.

Да кто ж спорит. Но все ли команды архитектуры компилятор может использовать эффективно?. Полагаю, что нет. В любом случае подглядывать в листинг приходится. Возможно, я заблуждаюсь, но как компилятору объяснить, что нужно параллельно просчитать произведение нескольких векторов? Библиотеки CMSIS DSP, которые реализуют подобные возможности, я глядел, написаны на асме и с использованием intrinsic-команд.

Share this post


Link to post
Share on other sites

Если честно, то я плотно вычислениями не занимался. В моём идеальном мире, если правильно задать типы данных и указать компилятору тип процессора/сопроцессора, то он сам должен "поработать". Ну и CMSIS DSP, наверное, хороший вариант. А на чём библиотека написана нас не должно сильно волновать.

Share this post


Link to post
Share on other sites
7 minutes ago, VladislavS said:

Если честно, то я плотно вычислениями не занимался

А у меня работа такая: мы измериловку делаем)

8 minutes ago, VladislavS said:

сопроцессора, то он сам должен "поработать"

Ну так в основном и есть до тех пор... пока что-нить не начнёт тормозить или работать неправильно.

8 minutes ago, VladislavS said:

А на чём библиотека написана нас не должно сильно волновать.

Опять же до поры до времени))) Но я только про себя))) Плюс у меня иногда и профессиональный азарт - поотимизировать, обойтись максимально малым количеством ресурсов. Например, система сбора данных, которую делаю сейчас, использует LPC4337. Там два ядра: m0 и m4. Прошлая версия использовала оба ядра. Я решил всё завести на одном (m4, конечно). Просто хочется поглубже изучить железо и софт, подрасти, так сказать профессионально.

Share this post


Link to post
Share on other sites
5 часов назад, VladislavS сказал:

Факторов влияющих на оптимизацию много. Почему такое в вашем проекте происходит автору виднее.

Имхо: потому что самый тяжёлый код (по вычислениям) у меня на асме; а тот, что на си - мне кажется потому что я когда пишу, хорошо знаю систему команд и предвижу, во что оно скомпилится. Поэтому даже на си тяжёлый по вычислениям код, стараюсь писать оптимально. Ну и очень часто смотрю в листинг.

Поэтому работы оптимизатору оставляю немного.  :wink:

5 часов назад, VladislavS сказал:

Это только усложняет оптимизацию.

Почему это?

5 часов назад, haker_fox сказал:

Прерывания тикают каждые 50 мкс

В моём проекте главное прерывание - с такой же частотой.  :ok:

5 часов назад, VladislavS сказал:

Случаи когда реально нужно вмешательство asm можно на пальцах пересчитать. Сделать сколь-либо серьёзный проект на asm лучше чем на ЯВУ ой как непросто. Компилятор ЯВУ оптимизирует без устали.

Если нужно тупо просуммировать (усреднить) кучу значений, зачем это делать на си, если это легко сделать на асме? Получив при этом ускорение на десятки %-ов с минимумом усилий. При сравнимой сложности.

5 часов назад, VladislavS сказал:

Если честно, то я плотно вычислениями не занимался. В моём идеальном мире, если правильно задать типы данных и указать компилятору тип процессора/сопроцессора, то он сам должен "поработать". 

Покажите пример как заставить компилятор использовать например: UADD16/UHADD16 - очень интересно!

Да хотя бы ту же самую CLZ - как?? Без интринсинков. Как написать код на си чтобы она появилась?

Share this post


Link to post
Share on other sites
5 часов назад, VladislavS сказал:

Ну и CMSIS DSP, наверное, хороший вариант. А на чём библиотека написана нас не должно сильно волновать.

Ну да, помнится когда я писал ещё для TMS320VC5502, там тоже были либы. Как же оно называлось?... :umnik2: DSPLIB вроде. Задействовал как-то из неё код 32-битного БИХ-фильтра на биквадратных звеньях. Ну ничё в принципе неплохо вроде. А потом заглянул в код этой функции... ии.... :shok: кто-ж так пишет??? Хотя вроде на асме написано, но такое ощущение, что писавший её даже не удосужился изучить систему команд ядра!

Переписал её нафиг. Получил ускорение примерно в 3 раза! Т.е. - не %-ы, а именно в разы! Так что библиотеки - не панацея. Их пишут индусы. Хотя может потому что она бесплатная была?...

Share this post


Link to post
Share on other sites
6 hours ago, VladislavS said:

Почему?

А как?) Вот хочу я "разом" найти среднее трёх векторов?

35 minutes ago, jcxz said:

Да хотя бы ту же самую CLZ - как?? Без интринсинков. Как написать код на си чтобы она появилась?

Угу. Более того, если сегодня он её даже и вставит, где гарантия, что вставит завтра при модификации кода...

Share this post


Link to post
Share on other sites
41 minutes ago, jcxz said:

Да хотя бы ту же самую CLZ - как?? Без интринсинков. Как написать код на си чтобы она появилась?

На кортексах есть core_cmInstr.h, оч. помогает. Кстати, у gcc есть __builtin_clz().

Для тех, кто любит разгонять, советую изучить опцию gcc -mslow-flash-data. По моим измерениям ускорило на несколько процентов. Интересно, в яре есть такая штука?

Share this post


Link to post
Share on other sites
19 минут назад, scifi сказал:

На кортексах есть core_cmInstr.h, оч. помогает. Кстати, у gcc есть __builtin_clz().

1 час назад, jcxz сказал:

Без интринсинков.

Интринсики - это тот же ассемблер, завуалированный.

19 минут назад, scifi сказал:

Для тех, кто любит разгонять, советую изучить опцию gcc -mslow-flash-data. По моим измерениям ускорило на несколько процентов. Интересно, в яре есть такая штука?

Если в IAR включить High-speed оптимизацию то вроде будет как раз на несколько %% быстрее. И то не факт. И код сильно раздувается.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this