|
gcc в разы быстрее IAR. В чем может быть дело..., неужели все дело в компиллерах... |
|
|
|
Jun 26 2007, 09:14
|
Частый гость
 
Группа: Свой
Сообщений: 181
Регистрация: 15-01-07
Пользователь №: 24 436

|
Цитата(Gemm @ Jun 26 2007, 12:04)  Есть плата на AT91RM9200, на ней поднят стек (uIP), операционной системы нет. Программа просто получает поток данных и кладет в SDRAM.
Скомпилировали программу под ИАРом и под gcc в Линухе. Скорость работы программы, скомпиленной под gcc в 3 (три!) раза выше, чем под ИАРом. Стабильность работы стека после gcc выше. В обоих проектах включены кэши.
Это нормально, когда так отличается скорость работы одной и той же проги, скомпиленной разными компилерами? Как "ускорить" код от ИАРа? Пробовал разные оптимизации - не помогает. Что может быть не настроено в ИАРе?... Простите за любопытство, просто тоже сейчас борюсь с производлительностью AT91RM9200, но на компилятор грешить даже мысли не было (теперь есть). А Вы под отладчиком работаете или нет?
|
|
|
|
|
Jun 26 2007, 09:41
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Абсурд. Скорее всего GCC неправильно выполняет какие-то операции и вылетает из процедур не выполняя их до конца. Отсюда и гигантский прирост скорости. Либо сам счетчик времени врет. GCC однозначно хуже компилирует чем коммерческие компиляторы, а тем более IAR. Но разрыв идет на проценты а не в разы. Цитата(Gemm @ Jun 26 2007, 11:34)  Есть плата на AT91RM9200, на ней поднят стек (uIP), операционной системы нет. Программа просто получает поток данных и кладет в SDRAM.
Скомпилировали программу под ИАРом и под gcc в Линухе. Скорость работы программы, скомпиленной под gcc в 3 (три!) раза выше, чем под ИАРом. Стабильность работы стека после gcc выше. В обоих проектах включены кэши.
Это нормально, когда так отличается скорость работы одной и той же проги, скомпиленной разными компилерами? Как "ускорить" код от ИАРа? Пробовал разные оптимизации - не помогает. Что может быть не настроено в ИАРе?...
|
|
|
|
|
Jun 26 2007, 10:10
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Цитата(Gemm @ Jun 26 2007, 11:04)  Скомпилировали программу под ИАРом и под gcc в Линухе. Скорость работы программы, скомпиленной под gcc в 3 (три!) раза выше, чем под ИАРом. Стабильность работы стека после gcc выше. В обоих проектах включены кэши. Это беспредметный разговор - версии GCC и IAR какие? Опции компиляции какие? Режимы ARM/Thumb? IAR 4.1x имеет довольно много ошибок - в свое время регулярно на них наталкивались. Версии 4.3x значительно лучше, но один раз компилятор тоже "был пойман" на генерации не совсем требуемого кода. Текущий 4.41 вроде пока ни в чем плохом не замечен. По опыту использования GCC 2.95, 3.1, 3.2 разных сборок под сygwin - некоторые проблемы есть, но все преодолимо, встроенный ассемблер у GCC считаю лучшим. Очерь понравился MS EVC, но там ассемблер полностью в стиле MASM и много танцев с бубном для получения бинарника (в-основном, EVC заточен для написания приложений под WinCE). Компилировалось несколько функций объемом 10-100 строк указанными компиляторами в режиме ARM - IAR впереди по компактности и скорости, но общие отличия действительно на уровне процентов, отнюдь не в разы.
|
|
|
|
|
Jun 26 2007, 11:33
|
Участник

Группа: Новичок
Сообщений: 30
Регистрация: 16-06-07
Пользователь №: 28 483

|
Могу дать уточнения по гэцэцэ, по версии IAR Gemm ответит. GCC 4.2.0, arm-none-eabi, сборка от codesourcery. Оптимизация - O2. единственное отличие в коде - используются "несколько иные" memcpy и memset - выдрал из ARM'овского порта mplayer'а (IAR не понимает код GAS'а, к сожалению). Правда копирования из памяти в память очень мало. Измеряем "скорость" одним и тем же сниффером, так что точность есть  P.S. Надо бы еще 3.4.6 и 2.9.5 затестить
|
|
|
|
|
Jun 26 2007, 12:05
|

Участник

Группа: Свой
Сообщений: 61
Регистрация: 2-08-05
Из: Коломна
Пользователь №: 7 283

|
Цитата(zltigo @ Jun 26 2007, 13:37)   Сначала стабильно работающую программу напишите, потом уже рассуждайте о качестве кода компиляторов. А с чего вы взяли, что она не стабильно работающая? Цитата(VslavX @ Jun 26 2007, 14:10)  Это беспредметный разговор - версии GCC и IAR какие?... IAR 4.41A. Режим ARM. Оптимизация отключена. Цитата(AlexandrY @ Jun 26 2007, 13:41)  Абсурд. Скорее всего GCC неправильно выполняет какие-то операции и вылетает из процедур... Да нет, вроде ничего не вылетает - корректное TCP соединение, корректные пакеты (смотрим снифером). Пингуется без ошибок. Только ГЦЦшная 0.19мс, а ИАРовская 0.3мс. Цитата(Paramedic @ Jun 26 2007, 13:14)  Простите за любопытство, просто тоже сейчас борюсь с производлительностью AT91RM9200, но на компилятор грешить даже мысли не было (теперь есть). А Вы под отладчиком работаете или нет? Работаем в IAR, отлаживаемся в нем же через JLink. Может и не надо грешить на компиллеры - возможно ошибка в нашем коде. Есть подозрение, что дата кэш не включился, тк прироста в скорости не обнаружил. Включаю так: asm("MRC p15, 0, r0, c1, c0, 0"); asm("ORR r0, r0, #0x00000004"); asm("MCR p15, 0, r0, c1, c0, 0"); Еще используем разные memcpy. Та, которая в ИАРовской библиотеке довольно медленная. Переписал свою на асме, но там траблы с выравниванием... Может кто поможет со быстрой стабильной memcpy и memset?
|
|
|
|
|
Jun 26 2007, 12:15
|
Частый гость
 
Группа: Свой
Сообщений: 181
Регистрация: 15-01-07
Пользователь №: 24 436

|
Цитата(Gemm @ Jun 26 2007, 16:05)  Есть подозрение, что дата кэш не включился, тк прироста в скорости не обнаружил. Включаю так: asm("MRC p15, 0, r0, c1, c0, 0"); asm("ORR r0, r0, #0x00000004"); asm("MCR p15, 0, r0, c1, c0, 0"); Я для включения дата кэша использую библиотечные функции: //*---------------------------------------------------------------------------- //* \fn AT91F_EnableDCache //* \brief Enable D Cache //*---------------------------------------------------------------------------- void AT91F_EnableDCache(void) { unsigned int ctl; ctl = AT91F_ARM_ReadControl(); ctl |= (1 << 2); AT91F_ARM_WriteControl(ctl); } //*---------------------------------------------------------------------------- //* \fn AT91F_ARM_ReadControl //* \brief Read Control register //*---------------------------------------------------------------------------- inline unsigned int AT91F_ARM_ReadControl() { register unsigned int ctl; asm("MRC p15, 0, r0, c1, c0, 0"); return ctl; } //*---------------------------------------------------------------------------- //* \fn AT91F_ARM_WriteControl //* \brief Write Control register //*---------------------------------------------------------------------------- inline void AT91F_ARM_WriteControl(unsigned int ctl) { asm("MCR p15,0,r0,c1,c0,0"); }
|
|
|
|
|
Jun 26 2007, 12:41
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Цитата(Gemm @ Jun 26 2007, 15:05)  IAR 4.41A. Режим ARM. Оптимизация отключена. Тады ничего сказать не могу - без оптимизации IAR пускать не пробовал. Цитата(Gemm @ Jun 26 2007, 15:05)  Есть подозрение, что дата кэш не включился, тк прироста в скорости не обнаружил. Включаю так: asm("MRC p15, 0, r0, c1, c0, 0"); asm("ORR r0, r0, #0x00000004"); asm("MCR p15, 0, r0, c1, c0, 0"); Хм, а разве на девятых ARM-ах кеш данных без включенного MMU работает? Помнится, там еще прилично кода по инициализации MMU требуется.
|
|
|
|
|
Jun 26 2007, 12:49
|
Частый гость
 
Группа: Свой
Сообщений: 181
Регистрация: 15-01-07
Пользователь №: 24 436

|
Цитата(Gemm @ Jun 26 2007, 16:05)  Только ГЦЦшная 0.19мс, а ИАРовская 0.3мс. Ну это не в три раза и даже не в два. С отключенной оптимизацией в ИАРе код заметно медленне исполняется.
|
|
|
|
|
Jun 26 2007, 12:58
|

Участник

Группа: Свой
Сообщений: 61
Регистрация: 2-08-05
Из: Коломна
Пользователь №: 7 283

|
Цитата(Paramedic @ Jun 26 2007, 16:49)  Ну это не в три раза и даже не в два. С отключенной оптимизацией в ИАРе код заметно медленне исполняется. Пробовал с оптимизациями - то же самое. Это только в пингах такая разница. В нормальном TCP обмене именно в 3 раза. Если не правильно включили дата кэш, то это неправильное включение - под обоими компиллерами.
|
|
|
|
|
Jun 26 2007, 13:05
|

Частый гость
 
Группа: Свой
Сообщений: 80
Регистрация: 21-03-05
Пользователь №: 3 559

|
Цитата(Gemm @ Jun 26 2007, 15:05)  Еще используем разные memcpy. Та, которая в ИАРовской библиотеке довольно медленная. Переписал свою на асме, но там траблы с выравниванием... Может кто поможет со быстрой стабильной memcpy и memset? Вот это: http://research.microsoft.com/invisible/sr.../_memfunc.s.htmя подрихтовал немного под IAR:
memfunc.rar ( 9.69 килобайт )
Кол-во скачиваний: 184
|
|
|
|
|
Jun 26 2007, 14:44
|

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

|
Цитата(Gemm @ Jun 26 2007, 15:05)  А с чего вы взяли, что она не стабильно работающая? Да, однако, с Ваших-же слов: Цитата Стабильность работы стека после gcc выше. Цитата(zhz @ Jun 26 2007, 16:05)  я подрихтовал немного под IAR:
memfunc.rar ( 9.69 килобайт )
Кол-во скачиваний: 184Да уж - глянул исходники IAR ( правда IAR 4.20 ) не ожидал такого тупого побайтового копирования увидеть. Однозначно надо пользовать разумный вариант с пословным копированием. Хотя в узких местах я традиционно с АРМ работаю с буферами выровненными на слово и размерами пакетов кратными слову. Затраты памяти не слишком велики а с быстродействием полегче. P.S. В приложении альтернативный приличный сишный вариант memcpy()
Сообщение отредактировал zltigo - Jun 26 2007, 15:19
Прикрепленные файлы
memcpy.rar ( 1.98 килобайт )
Кол-во скачиваний: 242
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 26 2007, 14:47
|
Участник

Группа: Новичок
Сообщений: 30
Регистрация: 16-06-07
Пользователь №: 28 483

|
zltigo, читайте это так: при компиляции gcc (как ARM, так и x86) программа работает стабильно. При компиляции IAR'ом - стабильно не работает.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|