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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Про IAR компилятор С
zltigo
сообщение Feb 9 2007, 15:09
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dopler @ Feb 9 2007, 13:40) *
Я имел в виду, что любимой избранной функции нельзя задать жестко уровень оптимизации. Т.е. нельзя написать какую-нибудь простенькую функцию, определить для нее максимальную оптимизацию и наслаждаться, при условии, что остальной проект выполнен без оптимизации.

1. Никто не мешает для этого конкретного файла задавать собственные критерии оптимизации
( или вообще не задавать) и все разруливать прагмами.
2. А вообще все "простенькие" функции в отдельный файл и тогда как угодно и как нужно и без прагм.
3. А какого черта проекты вообще без оптимизации собирать - для того что-бы написанный левой ногой код как-то работал? За десятки лет на добром десятке компиляторов никогда не делал ничего без оптимизации. Обычно отдельные куски тупо зажимаются по размеру. Большая часть тупо по максимальной скорости и некоторые критические функции - тонкой индивидуальной подстройкой по скорости. Куски кода с разными требованиями к оптимизации в один файл не сваливаются.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dopler
сообщение Feb 9 2007, 23:21
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Вернемся к поиску оптимального кода. Приведенный выше цикл с различными уровнями оптимизации:
Код
// Исходный цикл
for(d = 2000; d !=0; d--)
        __no_operation();


Код
  Оптимизации нет
     22                for(d = 2000; d !=0; d--)
   \   0000000A   FA21               MOVS     R1,#+250
   \   0000000C   C900               LSLS     R1,R1,#+3       ;; #+2000
   \   0000000E   0800               MOVS     R0,R1
   \                     ??main_2:
   \   00000010   0028               CMP      R0,#+0
   \   00000012   02D0               BEQ      ??main_3
     23                  __no_operation();
   \   00000014   C046               Nop      
   \   00000016   401E               SUBS     R0,R0,#+1
   \   00000018   FAE7               B        ??main_2


Код
  С оптимизацией
      22                for(d = 2000; d !=0; d--)
   \   00000010   0C00               MOVS     R4,R1
     23                  __no_operation();
   \                     ??main_2:
   \   00000012   C046               Nop      
   \   00000014   641E               SUBS     R4,R4,#+1
   \   00000016   FCD1               BNE      ??main_2


Очевидно, что второй код предпочтительнее, причем я на asm написал бы именно так. Единственное, что напрягает - это явно лишний Nop, попробуем от него избавится, сохраняя уровень оптимизации.
Код
Посто закоментировал Nop, и весь цикл улетел, попав под нож оптимизатора.
for(d = 2000; d !=0; d--);
//       __no_operation();


Пользуемся советом Сергея, делаем d volatile
Код
       17                int volatile d;
       20                for(d = 2000; d !=0; d--);
   \   00000012   0091               STR      R1,[SP, #+0]
   \   00000014   02E0               B        ??main_2
   \                     ??main_3:
   \   00000016   009C               LDR      R4,[SP, #+0]
   \   00000018   641E               SUBS     R4,R4,#+1
   \   0000001A   0094               STR      R4,[SP, #+0]
   \                     ??main_2:
   \   0000001C   009C               LDR      R4,[SP, #+0]
   \   0000001E   002C               CMP      R4,#+0
   \   00000020   F9D1               BNE      ??main_3


И видим, что весь цикл, где используется d перестает оптимизироваться, более того, d из регистров попадает прямиком в стек, что еще больше раздувает код, отсюда делаю вывод, что без явных причин использовать volatile не стоит.

Поэкспериментировав с различными галочками в оптимизаторе, убедился что без Code Motion цикл не пропадает, но все равно получить код как во втором примере, только без Nop не удалось.
Go to the top of the page
 
+Quote Post
Dopler
сообщение Feb 9 2007, 23:32
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



А вообще, компилятор действительно не плох, он цепляется за любую мелочь. Например, если 2000 выходит за ранг MOV, он понимает, что можно загрузить 250 и сдвинуть на 4. А вот если пользователь захочет 1999, тогда уж лучше завести константу в памяти. Конечно, про расчет времени выполнения программы по тактам можно забыть.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Feb 20 2007, 00:07
Сообщение #19


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Вот что у меня получилось IAR 4.41 оптимизция полная по скорости

Код
void delay(long tmp)
{
while(--tmp);
}



результат
Код
   In segment CODE, align 4, keep-with-next
                void delay(long tmp)
                {
                 while(--tmp);
                  delay:
                  ??delay_0:
                   00000000   010050E2           SUBS     R0,R0,#+1
                   00000004   FDFFFF1A            BNE      ??delay_0
                 }
                   00000008   1EFF2FE1            BX       LR              ;; return



при этом он пытается ее инлайнить всегда, но от этого можно легко избавится при желании
Go to the top of the page
 
+Quote Post
aspID
сообщение Mar 19 2008, 07:03
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714



дабы не открывать новую ветку...

Помогите понять, зачем так сложно:
(time описана как unsigned long)

Код
//   80   time++;
        LDI     R30, time
        LDI     R31, 0
        LD      R16, Z
        LDD     R17, Z+1
        LDD     R18, Z+2
        LDD     R19, Z+3
        SUBI    R16, 255
        SBCI    R17, 255
        SBCI    R18, 255
        SBCI    R19, 255
        ST      Z, R16
        STD     Z+1, R17
        STD     Z+2, R18
        STD     Z+3, R19
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 19 2008, 08:03
Сообщение #21


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(aspID @ Mar 19 2008, 09:03) *
дабы не открывать новую ветку...

Помогите понять, зачем так сложно:
(time описана как unsigned long)

Наоборот, это наиболее простой формат машинного представления времени и даты.
unsigned long содержит в себе количество секунд от некоторого базового момента. Из него можно получить текущие время и дату в человеческом формате путём несложных преобразований.
Или Вам не понтравилось как компилятор сделал инкремент?
Go to the top of the page
 
+Quote Post
aspID
сообщение Mar 19 2008, 08:08
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714



Цитата(IgorKossak @ Mar 19 2008, 14:03) *
Наоборот, это наиболее простой формат машинного представления времени и даты.
unsigned long содержит в себе количество секунд от некоторого базового момента. Из него можно получить текущие время и дату в человеческом формате путём несложных преобразований.
Или Вам не понтравилось как компилятор сделал инкремент?

Да, именно это и реализовывал smile.gif
Вот только почему так "широка страна моя..." в смысле почему в такую длинную цепочку развернулся обычный инк...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 19 2008, 08:13
Сообщение #23


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(aspID @ Mar 19 2008, 10:08) *
Да, именно это и реализовывал smile.gif
Вот только почему так "широка страна моя..." в смысле почему в такую длинную цепочку развернулся обычный инк...

А как Вы предполагали проще?
Приведите ассемблерный кусок.
Ну можно было разве что сэкономить регистры и не грузить весь лонг, а обрабатывать по одному байту, но экономии ни по длине кода ни по скорости в этом случае всё равно не будет.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 19 2008, 08:37
Сообщение #24


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Dopler @ Feb 9 2007, 15:36) *
Просто для совсем маленьких функций накладные расходы по вызову и передаче параметров неприятны. Если бы можно было бы функцию на asm сделать inline, было бы здорово.

А функцию на си можно инлайн объявить?
Если да, то что мешает внутри написать
asm("something asm text");

Я вот чё-то только __no_inline нашёл, то есть наоборот, запрет инлайна


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 19 2008, 08:48
Сообщение #25


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(MrYuran @ Mar 19 2008, 10:37) *
А функцию на си можно инлайн объявить?
Если да, то что мешает внутри написать
asm("something asm text");

Я вот чё-то только __no_inline нашёл, то есть наоборот, запрет инлайна

#pragma inline=forced
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 1st July 2025 - 22:41
Рейтинг@Mail.ru


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