Перейти к содержанию
    

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, Darth Vader said:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, haker_fox сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, jcxz said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, VladislavS said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Почему?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, VladislavS said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, VladislavS said:

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

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

8 minutes ago, VladislavS said:

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

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

8 minutes ago, VladislavS said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

Почему это?

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

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

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

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, VladislavS said:

Почему?

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

35 minutes ago, jcxz said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

41 minutes ago, jcxz said:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...