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

 
 
> ARM7 сравнение компиляторов, провел небольшое исследование
KRS
сообщение Oct 27 2009, 15:56
Сообщение #1


Профессионал
*****

Группа: Модераторы
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KRS
сообщение Oct 29 2009, 14:24
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 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
Улучшений серьезных нет sad.gif
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
Go to the top of the page
 
+Quote Post
KRS
сообщение Oct 29 2009, 16:18
Сообщение #3


Профессионал
*****

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



Цитата(KRS @ Oct 29 2009, 17:24) *
На примере простого кода, работы с битовыми полями, я его уже давно как то выкладывал, для версий 4.42, 5.11 и RVCT (уже не помню какого)


Еще раз посомтрел листинги, и заодно GNUC попробовал.
GNUC - BFI использует! А вот условное выполнение нет sad.gif.
А вот новый 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 битных команды.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 29 2009, 23:13
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(KRS @ Oct 29 2009, 21:18) *
как видно еще GNUC по другому подходит к загрузке адреса в регистр!
Но IMHO это неоптимально, вместо одной 16 битной инструкции и 32 бит данных используется две 32 битных команды.


Это для скорости, так наверное конвейер не слетаетsmile.gif При -Os gcc грузит адрес одной инструкцией.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
klen
сообщение Nov 1 2009, 11:18
Сообщение #5


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Генерит GCC условные команды IT
я взял асм своего проека где Stm32 UsbLib использую - там вот обнаружился такой кусок к примеру

Цитата
void ClearDTOG_RX(uint8_t bEpNum)
{
800160e: b2c0 uxtb r0, r0
_ClearDTOG_RX(bEpNum);
8001610: f853 2020 ldr.w r2, [r3, r0, lsl #2]
8001614: f412 4f80 tst.w r2, #16384 ; 0x4000
8001618: bf1f itttt ne
800161a: f853 1020 ldrne.w r1, [r3, r0, lsl #2]
800161e: f648 728f movwne r2, #36751 ; 0x8f8f
8001622: 400a andne r2, r1
8001624: f442 4280 orrne.w r2, r2, #16384 ; 0x4000
8001628: bf18 it ne
800162a: f843 2020 strne.w r2, [r3, r0, lsl #2]
}
800162e: 4770 bx lr
8001630: 40005c00 .word 0x40005c00


далее я взял примерно такойже кусок кода как выше указывался:
Код
struct bf_s {
    unsigned f1:20;
    char f2:8;
    char f3:8;
    unsigned f4:20;
} bf;

void long_var_if(char val,char cond)
{
  if (cond)
   {
      bf.f3 = val;
      bf.f1 = val;
      bf.f2 = val;
   }
  else
      bf.f4=val;
}

char var_if(char a ,  char b  )
{
  char x = a;
  if (a)
    {
      x = b;
    }  
  return x;  
}


arm-kgp-elf-gcc -mthumb -march=armv7-m -mcpu=cortex-m3 -S -O3 test2.c

результат:
Код
    .syntax unified
    .thumb
    .file    "test2.c"
    .text
    .align    2
    .global    long_var_if
    .thumb
    .thumb_func
    .type    long_var_if, %function
long_var_if:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 0, uses_anonymous_args = 0
    @ link register save eliminated.
    tst    r1, #255
    itete    ne
    ldrne    r3, .L4
    ldreq    r3, .L4
    ldrne    r2, [r3, #0]
    ldreq    r2, [r3, #4]
    uxtb    r0, r0
    itett    ne
    bfine    r2, r0, #0, #20
    bfieq    r2, r0, #8, #20
    strne    r2, [r3, #0]
    strbne    r0, [r3, #4]
    ite    ne
    strbne    r0, [r3, #3]
    streq    r2, [r3, #4]
    bx    lr
.L5:
    .align    2
.L4:
    .word    bf
    .size    long_var_if, .-long_var_if
    .align    2
    .global    var_if
    .thumb
    .thumb_func
    .type    var_if, %function
var_if:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 0, uses_anonymous_args = 0
    @ link register save eliminated.
    uxtb    r1, r1
    uxtb    r0, r0
    cmp    r0, #0
    ite    ne
    movne    r0, r1
    moveq    r0, #0
    bx    lr
    .size    var_if, .-var_if
    .comm    bf,8,4
    .ident    "GCC: (GNU) 4.5.0 20091029 (experimental)"


из сего видно что GCC прекрасно генерит BFI и IT команды. Другое дело что не ВСЕГДА КОГДА НАМ ЭТО ОЧЕВИДНО! полазив по исходникам компилера я увидел что допустим IT или переходы, например BNE являются для него алтернативами в зависимоти от ситуации принимается решение генерить то или иное. Если учесть что IT способно обойти и загрузить конвеер Cortex'а не более чем на 4 инструкции то становится понятным почему короткий if компиллер генерит через IT а более длинный с его точки зрения (n>4) генерится переход. Есть желание думать что скорость нада проверять а не наличие тех или иных команд.

собсно примерно так.
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 1 2009, 23:01
Сообщение #6


Профессионал
*****

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



Цитата(klen @ Nov 1 2009, 14:18) *
из сего видно что GCC прекрасно генерит BFI и IT команды. Другое дело что не ВСЕГДА КОГДА НАМ ЭТО ОЧЕВИДНО! полазив по исходникам компилера я увидел что допустим IT или переходы, например BNE ...

да это все известно и из описания архитектуры, для этого лезть в исходники компилера не надо!
в моем варианте функции var_if - GNUC явно полез оптимизировать нетуда! в итоге функция неимоверно больше по размеру, использует стек! и явно медленне работает!
Про BFI - я сразу говорил что гнусь это умеет! Вот что что а а все подобные иснтуркции гнусь всегда задействует. у IAR с BFI проблема пока.

По поводу Вашей функции var_if - вообще смешно!!!

RVCT - ее скомпилировал так
Код
var_if PROC
        CMP      r0,#0
        IT       NE
        MOVNE    r0,r1
        BX       lr
        ENDP

по поводу UTX - конечно можно спорить, но это явно лишнее, раз указано что на входе char, дополнительно чистить его не надо, это должна делать вызывающая сторона! арифмитических опреаций с переменными здесь не проводится так что переполнения в старшие биты быть не может!

листинг первой функции, выкладывать не буду, но он тоже оптимальнее и код красивее.
Go to the top of the page
 
+Quote Post
dch
сообщение Nov 2 2009, 00:57
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



обычно компиляторы несравниваются по наличию ошибок, по тому какой суппорт удается получить и как быстро компилятор переползает на новую архитектуру, пока не начинаются подмены ресурсов на публичных сайтах public domain или близкие к нему GNU ресурсы обычно достаточно надежны, впрочем наверное начинать писать свой кроскомпилятор уже наверное можно, судя
по количеству несанкционированного доступа к инет реурсам.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - 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


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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 03:56
Рейтинг@Mail.ru


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