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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> gcc в разы быстрее IAR. В чем может быть дело..., неужели все дело в компиллерах...
Gemm
сообщение Jun 26 2007, 08:04
Сообщение #1


Участник
*

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



Есть плата на AT91RM9200, на ней поднят стек (uIP), операционной системы нет. Программа просто получает поток данных и кладет в SDRAM.

Скомпилировали программу под ИАРом и под gcc в Линухе. Скорость работы программы, скомпиленной под gcc в 3 (три!) раза выше, чем под ИАРом. Стабильность работы стека после gcc выше. В обоих проектах включены кэши.

Это нормально, когда так отличается скорость работы одной и той же проги, скомпиленной разными компилерами? Как "ускорить" код от ИАРа? Пробовал разные оптимизации - не помогает. Что может быть не настроено в ИАРе?...
Go to the top of the page
 
+Quote Post
Paramedic
сообщение Jun 26 2007, 09:14
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 181
Регистрация: 15-01-07
Пользователь №: 24 436



Цитата(Gemm @ Jun 26 2007, 12:04) *
Есть плата на AT91RM9200, на ней поднят стек (uIP), операционной системы нет. Программа просто получает поток данных и кладет в SDRAM.

Скомпилировали программу под ИАРом и под gcc в Линухе. Скорость работы программы, скомпиленной под gcc в 3 (три!) раза выше, чем под ИАРом. Стабильность работы стека после gcc выше. В обоих проектах включены кэши.

Это нормально, когда так отличается скорость работы одной и той же проги, скомпиленной разными компилерами? Как "ускорить" код от ИАРа? Пробовал разные оптимизации - не помогает. Что может быть не настроено в ИАРе?...


Простите за любопытство, просто тоже сейчас борюсь с производлительностью AT91RM9200, но на компилятор грешить даже мысли не было (теперь есть). А Вы под отладчиком работаете или нет?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 26 2007, 09:37
Сообщение #3


Гуру
******

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



Цитата(Gemm @ Jun 26 2007, 11:04) *
Стабильность работы стека после gcc выше.

smile.gif Сначала стабильно работающую программу напишите, потом уже рассуждайте о качестве кода компиляторов.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jun 26 2007, 09:41
Сообщение #4


Ally
******

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



Абсурд.
Скорее всего GCC неправильно выполняет какие-то операции и вылетает из процедур не выполняя их до конца. Отсюда и гигантский прирост скорости.
Либо сам счетчик времени врет.
GCC однозначно хуже компилирует чем коммерческие компиляторы, а тем более IAR.
Но разрыв идет на проценты а не в разы.

Цитата(Gemm @ Jun 26 2007, 11:34) *
Есть плата на AT91RM9200, на ней поднят стек (uIP), операционной системы нет. Программа просто получает поток данных и кладет в SDRAM.

Скомпилировали программу под ИАРом и под gcc в Линухе. Скорость работы программы, скомпиленной под gcc в 3 (три!) раза выше, чем под ИАРом. Стабильность работы стека после gcc выше. В обоих проектах включены кэши.

Это нормально, когда так отличается скорость работы одной и той же проги, скомпиленной разными компилерами? Как "ускорить" код от ИАРа? Пробовал разные оптимизации - не помогает. Что может быть не настроено в ИАРе?...
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jun 26 2007, 10:10
Сообщение #5


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 впереди по компактности и скорости, но общие отличия действительно на уровне процентов, отнюдь не в разы.
Go to the top of the page
 
+Quote Post
e-yes
сообщение Jun 26 2007, 11:33
Сообщение #6


Участник
*

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



Могу дать уточнения по гэцэцэ, по версии IAR Gemm ответит.
GCC 4.2.0, arm-none-eabi, сборка от codesourcery. Оптимизация - O2.
единственное отличие в коде - используются "несколько иные" memcpy и memset - выдрал из ARM'овского порта mplayer'а (IAR не понимает код GAS'а, к сожалению). Правда копирования из памяти в память очень мало.

Измеряем "скорость" одним и тем же сниффером, так что точность естьsmile.gif

P.S. Надо бы еще 3.4.6 и 2.9.5 затеститьsmile.gif
Go to the top of the page
 
+Quote Post
Gemm
сообщение Jun 26 2007, 12:05
Сообщение #7


Участник
*

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



Цитата(zltigo @ Jun 26 2007, 13:37) *
smile.gif Сначала стабильно работающую программу напишите, потом уже рассуждайте о качестве кода компиляторов.

А с чего вы взяли, что она не стабильно работающая?

Цитата(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?
Go to the top of the page
 
+Quote Post
Paramedic
сообщение Jun 26 2007, 12:15
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 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");
}
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jun 26 2007, 12:41
Сообщение #9


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 требуется.
Go to the top of the page
 
+Quote Post
Paramedic
сообщение Jun 26 2007, 12:49
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 181
Регистрация: 15-01-07
Пользователь №: 24 436



Цитата(Gemm @ Jun 26 2007, 16:05) *
Только ГЦЦшная 0.19мс, а ИАРовская 0.3мс.


Ну это не в три раза и даже не в два.
С отключенной оптимизацией в ИАРе код заметно медленне исполняется.
Go to the top of the page
 
+Quote Post
Gemm
сообщение Jun 26 2007, 12:58
Сообщение #11


Участник
*

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



Цитата(Paramedic @ Jun 26 2007, 16:49) *
Ну это не в три раза и даже не в два.
С отключенной оптимизацией в ИАРе код заметно медленне исполняется.

Пробовал с оптимизациями - то же самое. Это только в пингах такая разница. В нормальном TCP обмене именно в 3 раза. Если не правильно включили дата кэш, то это неправильное включение - под обоими компиллерами.
Go to the top of the page
 
+Quote Post
zhz
сообщение Jun 26 2007, 13:05
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 26 2007, 14:44
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
e-yes
сообщение Jun 26 2007, 14:47
Сообщение #14


Участник
*

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



zltigo, читайте это так: при компиляции gcc (как ARM, так и x86) программа работает стабильно. При компиляции IAR'ом - стабильно не работает.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 26 2007, 14:52
Сообщение #15


Гуру
******

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



Цитата(e-yes @ Jun 26 2007, 17:47) *
zltigo, читайте это так: при компиляции gcc (как ARM, так и x86) программа работает стабильно. При компиляции IAR'ом - стабильно не работает.

Ну я так примерно и прочитал. И посоветовал сначала добиться работоспособности.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 22:26
Рейтинг@Mail.ru


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