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

 
 
 
Reply to this topicStart new topic
> Недооптимизация, (Cortex-M, IAR for ARM v7.50.3)
jcxz
сообщение Jul 11 2016, 06:49
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Проект для Cortex-M4. Включена полная оптимизация (хоть size, хоть speed, хоть balanced).
На один из условных операторов, компилятор выдаёт код:
Код
0x4588             CMP      R8,R1
0xD005             BEQ.N    ??TaskUsbView_6
0xEA48 0x2717      ORR      R7,R8,R7, LSR #+8
0xF8CD 0x8000      STR      R8,[SP, #+0]
0xF1A9 0x0908      SUB      R9,R9,#+8
??TaskUsbView_6:

Никак не могу понять - почему он не создаёт блок ITTT ?
В других местах кода полно IT, но в этом месте - никак. Ставил разные типы оптимизации: size, speed, balanced - один фиг. Что ему мешает???
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 11 2016, 07:11
Сообщение #2


Гуру
******

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



А что, IT блок в этой ситуации даст какие-то преимущества?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 11 2016, 07:24
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



А почему не даст? IT для того и придумано, чтобы быть быстрее чем ветвление на коротких участках.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 11 2016, 07:27
Сообщение #4


Гуру
******

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



Цитата(jcxz @ Jul 11 2016, 10:24) *
А почему не даст? IT для того и придумано, чтобы быть быстрее чем ветвление на коротких участках.

Ну тогда посчитайте такты и сравните. Мне вовсе не очевидно, что здесь ITTT будет быстрее.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 11 2016, 07:43
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(scifi @ Jul 11 2016, 13:27) *
Ну тогда посчитайте такты и сравните. Мне вовсе не очевидно, что здесь ITTT будет быстрее.

А что их считать? Если есть ещё более длинные команды (ITTTT, ITTTE) какой смысл было их делать в ядре если бы они не давали эффекта по сравнению с B?
IT всегда быстрее B.
За счёт "IT folding" IT всегда быстрее Bcond (в среднем конечно, если считать прохождение веток да/нет равновероятным).
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 11 2016, 08:27
Сообщение #6


Гуру
******

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



Цитата(jcxz @ Jul 11 2016, 10:43) *
А что их считать?

Ну, если вам лень, я сам посчитаю.
С инструкцией BEQ: 5 тактов, если сравнение "равно", 2 такта в противном случае.
С инструкцией ITTT: 4 такта, если сравнение "равно", 3 такта в противном случае.
Это если память без задержек.
Что-то я не вижу, что ITTT всех порвал как тузик грелку.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 11 2016, 10:20
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(scifi @ Jul 11 2016, 14:27) *
Ну, если вам лень, я сам посчитаю.
С инструкцией BEQ: 5 тактов, если сравнение "равно", 2 такта в противном случае.
С инструкцией ITTT: 4 такта, если сравнение "равно", 3 такта в противном случае.
Это если память без задержек.
Что-то я не вижу, что ITTT всех порвал как тузик грелку.

Под "равно" Вы наверное имели в виду "не равно"? sm.gif Т.е. - NE.
И Вы забыли про "IT folding".
Мои расчёты:
с BEQ (начиная от неё): если NE = 5 тактов, если EQ = 2...4 такта.
с ITTT (начиная от неё): если NE = 4 такта, если EQ = не знаю, но думаю 3 такта (на пропуск каждой инструкции).
Т.е. - ITTT однозначно лучше. Компилятор не знает ничего о скорости памяти, так что в расчёт должен брать среднее время условного ветвления. К тому же ветвление вроде не только от скорости памяти зависит, но и от выравнивания целевой инструкции.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 11 2016, 10:49
Сообщение #8


Гуру
******

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



Цитата(jcxz @ Jul 11 2016, 13:20) *
с BEQ (начиная от неё): если NE = 5 тактов, если EQ = 2...4 такта.

А, ну да, тут я немного напутал.
Да и фиг с ним, с этим лишним тактом. Я думаю, если всё время в дизассемблер заглядывать и горевать, можно приобрести преждевременную седину biggrin.gif Не может компилятор всегда выдавать оптимальный код.
Go to the top of the page
 
+Quote Post

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

 


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


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