|
WinAVR-20070122 еще сырой?, ошибки оптимизации |
|
|
|
Feb 17 2007, 04:29
|
Группа: Участник
Сообщений: 8
Регистрация: 6-03-06
Из: Новосибирск
Пользователь №: 15 027

|
Вот пример генерации кода. опции -Os
---------------------------------------------------------
int g;
int func(void) { int res; { uint8_t _SReg; asm volatile("in %0,__SREG__\n\tcli" : "=r" (_SReg));
res = g;
asm volatile( "out __SREG__,%0" :: "r" (_SReg)); } return res; } -------------------------------------------------------- WinAVR 20060421 (правильно)
28 0000 2FB7 in r18,__SREG__ 29 0002 F894 cli 32 0004 8091 0000 lds r24,g 33 0008 9091 0000 lds r25,(g)+1 36 000c 2FBF out __SREG__,r18 40 000e 0895 ret
--------------------------------------------------------- WinAVR 20070122 (неправильно)
32 0006 8FB7 in r24,__SREG__ 33 0008 F894 cli 37 000a 8FBF out __SREG__,r24 40 000c 8091 0000 lds r24,g 41 0010 9091 0000 lds r25,(g)+1 46 0014 0895 ret
---------------------------------------------------------
|
|
|
|
|
 |
Ответов
|
Feb 24 2007, 12:38
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(gormih @ Feb 23 2007, 23:51)  WinAVR еще долго будет сырым по определению. Все таки продукт не коммерческий... Хотите получить оптимизаию - пользуйте IAR или на худой конец CodeVision Цитата(gormih @ Feb 24 2007, 00:34)  Уважаемый Анатолий!
Я понимаю Вашу озабоченность по поводу того, что здесь может начаться дискуссия по поводу сравнения характеристик того или иного компилятора, однако смею Вас уверить, что мой пост имеет прямое отношение к проблеме оптимизации, как ни крути. Однако, если Вам не нравится перспектива обсуждать данную тему - то по моему ее можно просто закрыть - было сказано, что проблема будет решена в следующих версиях... возможно лет через 10... Хотите поговорить про оптимизацию ... Давайте поговорим... Вот вам небольшой тестик: Нужно скопировать один массив на 255 байт в два других. Вот код: Код unsigned char sr[255]; unsigned char ds1[255]; unsigned char ds2[255];
int main( void ) { unsigned char i=255; unsigned char *ps=sr; unsigned char *pd1=ds1; unsigned char *pd2=ds2;
do { *pd1++=*ps; *pd2++=*ps++; } while (--i);
return 0; } Предлагаю поступить так, Вы компилируете этот код под IAR а я под WinAVR-20060421 при любом уровне оптимизации Ну и дальше каждый выкладывает сюда результат - количество тактов на выполнение цикла. Готовы ? P.S. WinAVR-20070122 действительно очень сырой, я попробовал поставить его в надежде что исчезнут некоторые глюки предыдущей версии, но оказалось что при компиляции куска проги которая раньше занимала ~2200байт в новой версии у меня получилось 2600+ байт. Честно говоря я даже разбираться не стал в чем дело и просто его стер.
|
|
|
|
|
Feb 26 2007, 22:55
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Цитата(singlskv @ Feb 24 2007, 12:38)  Хотите поговорить про оптимизацию ... Давайте поговорим... Вот вам небольшой тестик: Нужно скопировать один массив на 255 байт в два других. Вот код: Код unsigned char sr[255]; unsigned char ds1[255]; unsigned char ds2[255];
int main( void ) { unsigned char i=255; unsigned char *ps=sr; unsigned char *pd1=ds1; unsigned char *pd2=ds2;
do { *pd1++=*ps; *pd2++=*ps++; } while (--i);
return 0; } Предлагаю поступить так, Вы компилируете этот код под IAR а я под WinAVR-20060421 при любом уровне оптимизации Ну и дальше каждый выкладывает сюда результат - количество тактов на выполнение цикла. Готовы ? P.S. WinAVR-20070122 действительно очень сырой, я попробовал поставить его в надежде что исчезнут некоторые глюки предыдущей версии, но оказалось что при компиляции куска проги которая раньше занимала ~2200байт в новой версии у меня получилось 2600+ байт. Честно говоря я даже разбираться не стал в чем дело и просто его стер. Не собираюсь этого делать по двум причинам: 1) Не собираюсь пользовать WinAVR просто потому, что уже неоднократно сравнивал для своих задач уровни оптимальности кода в разных компиляторах. Пользуюсь исключительно codevision как самый простой в понимании, вмеру навороченный компилятор с оптимальным уровнем качества генерируемого кода. Ваша задача явно заточена под winavr, не спорю что именно она будет скомпилироваа в нем самым оптимальным способом. 2) Вообще редко пишу на си, а когда это делаю WinAVR напрягает сложностью вставки ассемблерных вставок. Ни для кого не секрет, что оптимальней связки си+асм нет. WinAVR упорно игнорирует данное обстоятельство, делать ассемблерные вставки по меньшей мере неудобно. P.S: Вашу задачу я бы вообще написал на асме :-) Си использую только при необходимости сложных вычислений.
Сообщение отредактировал gormih - Feb 26 2007, 22:59
--------------------
Это не то что вы подумали ...
|
|
|
|
|
Feb 26 2007, 23:28
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(gormih @ Feb 26 2007, 22:55)  Не собираюсь этого делать по двум причинам:
1) Не собираюсь пользовать WinAVR просто потому, что уже неоднократно сравнивал для своих задач уровни оптимальности кода в разных компиляторах. Пользуюсь исключительно codevision как самый простой в понимании, вмеру навороченный компилятор с оптимальным уровнем качества генерируемого кода. Ваша задача явно заточена под winavr, не спорю что именно она будет скомпилироваа в нем самым оптимальным способом. ну я так понимаю что Вы все-таки попробовали скомпилировать мою задачку под CV(IAR) и посмотрев на код отказались от попыток сравнивать ? Кстати, задачка НЕ написана под конкретный компилятор! Это просто вариант когда есть 3 источника/приемника длинных данных Выдернуто из реальной программы (с большими упрощениями) Да и написано на чистом C как в учебниках учат... А насчет неоптимальности получаемого Вами кода, так на C нужно тоже не абы как писать или Вы рассчитываете что за Вас все компилятор сделает ? Цитата 2) Вообще редко пишу на си, а когда это делаю WinAVR напрягает сложностью вставки ассемблерных вставок. Ни для кого не секрет, что оптимальней связки си+асм нет. WinAVR упорно игнорирует данное обстоятельство, делать ассемблерные вставки по меньшей мере неудобно. ну это дело привычки Цитата P.S: Вашу задачу я бы вообще написал на асме :-) Си использую только при необходимости сложных вычислений. попробуйте написать лучше чем сгенерит WinAVR...(в данной конкретной задаче)
|
|
|
|
|
Feb 27 2007, 12:52
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Цитата(singlskv @ Feb 26 2007, 23:28)  А насчет неоптимальности получаемого Вами кода, так на C нужно тоже не абы как писать или Вы рассчитываете что за Вас все компилятор сделает ? Не надеюсь. Да и не собираюсь думать, чего он там сделает. Просто возьму и напишу на асме - благо, что для меня это не проблема. У всех компиляторов свои методы компиляции тех или иных выражений на си, и думать, выяснять как скомпилирует выражение си конкретный компилятор не всегда есть время, согласитесь. Проще взять компилятор, который в большинстве случаев не давит на мозг своими наворотами и оптимально компилирует, либо просто написать на асме. Писать на асме вообще полезно - становишся ближе к железке, код становится чище и светлее :-) Спорить можно бесконечно, таких тем на форуме и других форумах великое множество. Но, в коенчном счете спорить на эту тему бесполезно - для большинства приложений нет никакой разницы на чем написана программа, главное чтобы она работала и программист понимал, как она работает (что бывает далеко не всегда)
--------------------
Это не то что вы подумали ...
|
|
|
|
Сообщений в этой теме
Jat WinAVR-20070122 еще сырой? Feb 17 2007, 04:29 beer_warrior Вчера был на avrfreaks. Там много таких вопросов.
... Feb 17 2007, 12:32 aesok К сожалению это не компилятор сырой, а ваш код. Пр... Feb 17 2007, 14:10 ahulap Заметил, что по сравнению с WinAVR 20060125 код ст... Feb 17 2007, 15:31 aesok Цитата(ahulap @ Feb 17 2007, 15:31) Замет... Feb 17 2007, 16:44  ahulap [/quote]
Если у вас есть локальные переменные в ... Feb 17 2007, 19:00  defunct Цитата(aesok @ Feb 17 2007, 15:44) Если у... Feb 23 2007, 16:23 ahulap Провел эксперименты, вот что получил:
unsigned in... Feb 18 2007, 00:16 aesok В настоящий момент самый эффективный способ в GCC ... Feb 18 2007, 00:43 ahulap Нашел отличие:
00003900 <main>:
3900: 2f... Feb 23 2007, 15:55 aesok Цитата(ahulap @ Feb 23 2007, 15:55) Нашел... Feb 23 2007, 23:43 gormih WinAVR еще долго будет сырым по определению.
Все... Feb 23 2007, 23:51 aesok Цитата(gormih @ Feb 23 2007, 23:51) WinAV... Feb 23 2007, 23:58  gormih Цитата(aesok @ Feb 23 2007, 23:58) Уважае... Feb 24 2007, 00:34   aesok Цитата(gormih @ Feb 24 2007, 00:34) Цитат... Feb 24 2007, 00:43    ahulap Цитата(aesok @ Feb 23 2007, 23:43) Патчи ... Feb 24 2007, 13:12     aesok Цитата(ahulap @ Feb 24 2007, 13:12) Цитат... Feb 24 2007, 13:32 Abakt Он же не пишет - "лучше-хуже" он именно ... Feb 24 2007, 00:42 beer_warrior ЦитатаДа и не собираюсь думать, чего он там сделае... Feb 27 2007, 14:52 gormih Цитата(beer_warrior @ Feb 27 2007, 14:52)... Feb 27 2007, 14:57 beer_warrior ЦитатаА Ваше высказывания кроме того, что Вы хам -... Feb 27 2007, 15:08 gormih Цитата(beer_warrior @ Feb 27 2007, 15:08)... Feb 27 2007, 16:03 beer_warrior Цитатаа GNU GPL же тренируются молодые перспективн... Feb 27 2007, 16:32 gormih Цитата(beer_warrior @ Feb 27 2007, 16:32)... Feb 27 2007, 16:42 gormih на сколько понимаю на этом всё Mar 1 2007, 23:53 ahulap Вот еще что обнаружил:
есть маленнькая функция
st... Mar 5 2007, 16:19 aesok Цитата(ahulap @ Mar 5 2007, 16:19) Вот ещ... Mar 5 2007, 18:11  ahulap Цитата(aesok @ Mar 5 2007, 17:11) Цитата(... Mar 5 2007, 18:57 beer_warrior Цитатана сколько понимаю на этом всё
Я просил плат... Mar 5 2007, 17:22 gormih Цитата(beer_warrior @ Mar 5 2007, 17:22) ... Mar 6 2007, 01:12 IgorKossak Поумерьте свой пыд, господа.
Тема уже давно себя и... Mar 6 2007, 10:46 IgorKossak gormin довыступался до предупреждения из-за грубос... Mar 7 2007, 18:15
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|