|
ARM7 сравнение компиляторов, провел небольшое исследование |
|
|
|
Oct 27 2009, 15:56
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
компиляторы - IAR V5.40.2.51604/W32 RVCT4.0 [Build 650] (Sourcery G++ Lite 2009q1-161) 4.3.3 Задача: распаковка LZMA из внутренней Flash, только распаковка, данные никуда не отсылаются. запакованный размер - 244625 распакованный - 605992 размер словаря 8 кб данные - прошивка от блекфина. оптимизация максимальная по скорости Платформа: ARM - LPC2138 частота 50 Mhz MAM включен размер кода (только декодер) Код IAR RVCT GNUC ARM 3032 3284 3844 THUMB 2372 2514 2844 Время выполнения в ms (измерял с помощью таймера с прескалером 0) код выполнялся из памяти Код IAR RVCT GNUC ARM 1754 1737 2212 THUMB 2720 2761 2494 код из флеша Код IAR RVCT GNUC ARM 1954 1950 2323 THUMB 2870 2942 2738 В тумбе IAR генерит более быстрый и компактный код по сравнению с RVCT. В ARM из flash разница в скорости ~0.2% что несущественно, а вот код ~8% компактнее. С GNUC - интересно в тумбе код большой, но более быстрый. Посмотрел по листингу - это связано с тем что GNUC в тумбе использует r8, r9 ( r10,r11 не использовал) PS - общий проект в IAR, разными компиляторами компилировал только функцию декодера, а т.к. все EABI, то IARовсикй линкер без проблем жрал. Поэтому измерение времени для разных компилеров корректно - именно время распаковки.
Сообщение отредактировал KRS - Oct 27 2009, 16:15
|
|
|
|
|
 |
Ответов
|
Oct 29 2009, 14:24
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
На примере простого кода, работы с битовыми полями, я его уже давно как то выкладывал, для версий 4.42, 5.11 и RVCT (уже не помню какого) Код struct bf_s { unsigned f1:6; unsigned f2:2; unsigned f3:20; unsigned f4:4; } bf;
void short_clear(void) { bf.f2 = 0; }
void short_set(void) { bf.f2 = 3; }
void short_const(void) { bf.f2 = 1; }
void short_var(unsigned val) { bf.f2 = val; }
void long_clear(void) { bf.f3 = 0; }
void long_set(void) { bf.f3 = (1<<20)-1; }
void long_const(void) { bf.f3 = 1; }
void long_var(unsigned val) { bf.f3 = val; }
void long_var_if(unsigned val,unsigned cond) { if (cond) bf.f3 = val; else bf.f4=val; }
unsigned a; unsigned b; unsigned c; void var_if(unsigned val) { if (val) a = c; else b = c; c = val; } Сейчас скомпилил последним иаром V5.40.2.51604/W32 Улучшений серьезных нет  BFI и условное выполнение до сих пор IAR делать не умеет! Для примера листинг одной функции Код RVCT -O3 -Otime --cpu Cortex-M3 long_var_if PROC LDR r3,|L1.176| CMP r1,#0 LDR r2,[r3,#0] ITE EQ BFIEQ r2,r0,#28,#4 BFINE r2,r0,#8,#20 STR r2,[r3,#0] ; bf BX lr ENDP
IAR --cpu Cortex-M3 -Ohs long_var_if: LDR.N R2,??DataTable13 ;; bf LDR R3,[R2, #+0] CBZ R1,??long_var_if_0 LDR.N R1,??DataTable14 ;; 0xf00000ff ANDS R1,R1,R3 LDR.N R3,??DataTable15 ;; 0xfffff00 AND R0,R3,R0, LSL #+8 ORRS R0,R0,R1 B.N ??long_var_if_1 ??long_var_if_0: LSLS R1,R3,#+4 LSRS R1,R1,#+4 ORR R0,R1,R0, LSL #+28 ??long_var_if_1: STR R0,[R2, #+0]
BX LR
|
|
|
|
|
Oct 29 2009, 16:18
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(KRS @ Oct 29 2009, 17:24)  На примере простого кода, работы с битовыми полями, я его уже давно как то выкладывал, для версий 4.42, 5.11 и RVCT (уже не помню какого) Еще раз посомтрел листинги, и заодно GNUC попробовал. GNUC - BFI использует! А вот условное выполнение нет  . А вот новый IAR оказывается умеет иногда использовать условное выполнение и почему не всегда - загадка, вот листинги последней функции Код GNUC gcc version 4.3.3 (Sourcery G++ Lite 2009q1-161) -O3 var_if: @ args = 0, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 @ link register save eliminated. push {r4} mov r4, r0 cbnz r0, .L29 movw r1, #:lower16:c movt r1, #:upper16:c movw r2, #:lower16:b ldr r3, [r1, #0] movt r2, #:upper16:b str r3, [r2, #0] .L27: str r4, [r1, #0] pop {r4} bx lr .L29: movw r1, #:lower16:c movt r1, #:upper16:c movw r2, #:lower16:a ldr r3, [r1, #0] movt r2, #:upper16:a str r3, [r2, #0] b .L27
IAR
var_if: LDR.N R1,??var_if_0 ;; a LDR R2,[R1, #+8] CMP R0,#+0 ITE NE STRNE R2,[R1, #+0] STREQ R2,[R1, #+4] STR R0,[R1, #+8]
BX LR ;; return
RVCT var_if PROC LDR r2,|L1.176| CMP r0,#0 LDR r1,[r2,#0xc] ITE EQ STREQ r1,[r2,#8] ; b STRNE r1,[r2,#4] ; a STR r0,[r2,#0xc] ; c BX lr ENDP как видно еще GNUC по другому подходит к загрузке адреса в регистр! Но IMHO это неоптимально, вместо одной 16 битной инструкции и 32 бит данных используется две 32 битных команды.
|
|
|
|
Сообщений в этой теме
KRS ARM7 сравнение компиляторов Oct 27 2009, 15:56 Sunder_RUS Вот ещё тестирование.
http://www.phyton.ru/pages/p... Oct 27 2009, 19:52 Rst7 Цитатапровел небольшое исследование
Голые цифры -... Oct 27 2009, 20:53 KRS Цитата(Rst7 @ Oct 27 2009, 23:53) Голые ц... Oct 27 2009, 21:12 Harbour Цитата(Rst7 @ Oct 27 2009, 22:53) Хотя ли... Oct 28 2009, 04:31 Rst7 ЦитатаОбоснуйте, с каких это пор ?
С тех пор, как... Oct 28 2009, 05:02 Harbour Улучшение x86 не значит ухудшение embedded one. ве... Oct 28 2009, 13:21 Rst7 Цитатавекторизацию точили для SMP Cell/PPC/x86_64
... Oct 28 2009, 13:34 Harbour ЦитатаОшибаетесь. Для PowerPC векторизация не нужн... Oct 28 2009, 15:31 Rst7 ЦитатаВекторизация использует SIMD инструкции, для... Oct 29 2009, 06:22 Harbour ЦитатаДа нет. Я не об этом. Я о той векторизации, ... Oct 29 2009, 09:05 yuri_t На моих проектах (RTOS,TCP/IP etc) для ARM7/9 самы... Oct 29 2009, 09:18 KRS Цитата(yuri_t @ Oct 29 2009, 12:18) А вот... Oct 29 2009, 10:59 etoja Цитата(yuri_t @ Oct 29 2009, 12:18) самый... Oct 29 2009, 11:27  KRS Цитата(etoja @ Oct 29 2009, 14:27) Если р... Oct 29 2009, 11:48 Rst7 ЦитатаЭто не совсем векторизация - это банальная о... Oct 29 2009, 09:20 Rst7 ЦитатаА вот для Cortex-M3 IAR 5.40 генерит очень м... Oct 29 2009, 13:49 yuri_t Цитата(Rst7 @ Oct 29 2009, 16:49) Листинг... Oct 29 2009, 14:12  AHTOXA Цитата(KRS @ Oct 29 2009, 21:18) как видн... Oct 29 2009, 23:13   klen Генерит GCC условные команды IT
я взял асм своего ... Nov 1 2009, 11:18    KRS Цитата(klen @ Nov 1 2009, 14:18) из сего ... Nov 1 2009, 23:01     dch обычно компиляторы несравниваются по наличию ошибо... Nov 2 2009, 00:57 Rst7 Цитатаhttp://tnkernel.com/downloads/tnkernel-2-5..... Oct 29 2009, 14:26 ReAl Полуоффтоп:
Не, ну таки странности у gcc проскакив... Nov 2 2009, 01:18 brag Выкладываю несколько результатов бенчмарков. мож к... Jun 11 2012, 08:58 brag Ни один компилятор не смог нормально соптимизирова... Jul 6 2012, 05:57 Petka Цитата(brag @ Jul 6 2012, 09:57) Ни один ... Jul 6 2012, 06:41 brag ЦитатаСледующаяя строка кода может работать с совс... Jul 6 2012, 07:18 Petka Цитата(brag @ Jul 6 2012, 11:18) Интересн... Jul 6 2012, 07:45 brag ЦитатаА если next->prev == &(prev->next)... Jul 6 2012, 07:54 Petka Цитата(brag @ Jul 6 2012, 11:54) &(pr... Jul 6 2012, 08:38 brag Тоесть компилятор всегда перегружает переменную,ес... Jul 6 2012, 08:52 Petka Цитата(brag @ Jul 6 2012, 12:52) Тоесть к... Jul 6 2012, 09:39 Сергей Борщ В "голых" Сях есть квалификатор restrict... Jul 6 2012, 09:43 brag Цитатанет указания компилятору что содержимое b мо... Jul 6 2012, 10:21 Petka Цитата(brag @ Jul 6 2012, 14:21) Тогда в ... Jul 6 2012, 11:24
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|