Перейти к содержанию
    

Cortex-A53 и ARM DS 2021

Пробую хвалёный ARM Compiler 6 из под ARM Development Studio 2021, версия компилятора 6.16.

Скомпилировал простую програмку в режиме aarch64 с вызовом memset, оптимизация О2 (пробовал О3, даже Omax).

Дизассемблер этой функции:

  _memset
        0x00008c14:    b4000261    a...    CBZ      x1,0x8c60 ; _memset + 76
        0x00008c18:    36000060    `..6    TBZ      w0,#0,0x8c24 ; _memset + 16
        0x00008c1c:    38001402    ...8    STRB     w2,[x0],#1
        0x00008c20:    d1000421    !...    SUB      x1,x1,#1
        0x00008c24:    f1000828    (...    SUBS     x8,x1,#2
        0x00008c28:    54000143    C..T    B.CC     0x8c50 ; _memset + 60
        0x00008c2c:    36080060    `..6    TBZ      w0,#1,0x8c38 ; _memset + 36
        0x00008c30:    78002402    .$.x    STRH     w2,[x0],#2
        0x00008c34:    aa0803e1    ....    MOV      x1,x8
        0x00008c38:    f100103f    ?...    CMP      x1,#4
        0x00008c3c:    540000a3    ...T    B.CC     0x8c50 ; _memset + 60
        0x00008c40:    d1001021    !...    SUB      x1,x1,#4
        0x00008c44:    f1000c3f    ?...    CMP      x1,#3
        0x00008c48:    b8004402    .D..    STR      w2,[x0],#4
        0x00008c4c:    54ffffa8    ...T    B.HI     0x8c40 ; _memset + 44
        0x00008c50:    36080041    A..6    TBZ      w1,#1,0x8c58 ; _memset + 68
        0x00008c54:    78002402    .$.x    STRH     w2,[x0],#2
        0x00008c58:    36000041    A..6    TBZ      w1,#0,0x8c60 ; _memset + 76
        0x00008c5c:    39000002    ...9    STRB     w2,[x0,#0]
        0x00008c60:    d65f03c0    .._.    RET      
    __aeabi_memclr4
    __aeabi_memclr8
    __rt_memclr_w
        0x00008c64:    f100103f    ?...    CMP      x1,#4
        0x00008c68:    540000a3    ...T    B.CC     0x8c7c ; __aeabi_memclr4 + 24
        0x00008c6c:    d1001021    !...    SUB      x1,x1,#4
        0x00008c70:    f1000c3f    ?...    CMP      x1,#3
        0x00008c74:    b800441f    .D..    STR      wzr,[x0],#4
        0x00008c78:    54ffffa8    ...T    B.HI     0x8c6c ; __aeabi_memclr4 + 8
        0x00008c7c:    37080061    a..7    TBNZ     w1,#1,0x8c88 ; __aeabi_memclr4 + 36
        0x00008c80:    37000081    ...7    TBNZ     w1,#0,0x8c90 ; __aeabi_memclr4 + 44
        0x00008c84:    d65f03c0    .._.    RET      
        0x00008c88:    7800241f    .$.x    STRH     wzr,[x0],#2
        0x00008c8c:    3607ffc1    ...6    TBZ      w1,#0,0x8c84 ; __aeabi_memclr4 + 32
        0x00008c90:    3900001f    ...9    STRB     wzr,[x0,#0]
        0x00008c94:    d65f03c0    .._.    RET      
    _memset_w
        0x00008c98:    f100103f    ?...    CMP      x1,#4
        0x00008c9c:    540000a3    ...T    B.CC     0x8cb0 ; _memset_w + 24
        0x00008ca0:    d1001021    !...    SUB      x1,x1,#4
        0x00008ca4:    f1000c3f    ?...    CMP      x1,#3
        0x00008ca8:    b8004402    .D..    STR      w2,[x0],#4
        0x00008cac:    54ffffa8    ...T    B.HI     0x8ca0 ; _memset_w + 8
        0x00008cb0:    37080061    a..7    TBNZ     w1,#1,0x8cbc ; _memset_w + 36
        0x00008cb4:    37000081    ...7    TBNZ     w1,#0,0x8cc4 ; _memset_w + 44
        0x00008cb8:    d65f03c0    .._.    RET      
        0x00008cbc:    78002402    .$.x    STRH     w2,[x0],#2
        0x00008cc0:    3607ffc1    ...6    TBZ      w1,#0,0x8cb8 ; _memset_w + 32
        0x00008cc4:    39000002    ...9    STRB     w2,[x0,#0]
        0x00008cc8:    d65f03c0    .._.    RET      

И что-то я не вижу высоко-оптимизированного кода.

Запись максимум 32-мя битами на 64 битном процессоре, никаких векторных регистров не задействовано...

 

Это что за шит такой? Даже в бесплатном GCC эта функция юзает регистр NEONа, а здесь даже конь не валялся...

Может, я что-то делаю не так? Или просто библиотеки для ARMv8-A под 64 бита сделаны абы как?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На форуме ARM ответили, что они сейчас не делают супер-оптимизированные библиотеки для ARMv8-A, а вместо этого есть оптимизированные процедуры отдельно вот здесь: ARM-software / optimized-routines

И на том спасибо :)

 

Странно, конечно, что либы для нового 6-го компилятора не дотягивают до либ старого 5-го.

 

Кстати, прогнал Dhrystone Benchmark v2.1 (из Vitis 2022.1), оптимизация О2, DMIPS/MHz:

GCC 11.2:           2.88

armclang v6.16:  5.75

 

Почему-то получилось, что гнусь в два раза медленнее :pardon:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 15.09.2022 в 12:23, sonycman сказал:

Скомпилировал простую програмку в режиме aarch64

В чем принципиальная прелесть этих 64бит? Кроме доступа к большим объемам ОЗУ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 24.09.2022 в 21:06, mantech сказал:

В чем принципиальная прелесть этих 64бит? Кроме доступа к большим объемам ОЗУ?

Не знаю, мне стало интересно, вот и решил глянуть. 

Наверное, ещё такие камешки могут быстрее ворочать большими объёмами данных?

 

Вообще, машинный код ARMv8-A мне показался больше похожим на MIPS или RISC-V, чем на собственно ARM... :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

насколько я знаю, ARM рекомендует не использовать STM/LDM инструкции для продвинутых Cortex-A

компиляторщики, наверно, следуют этой рекомендации... а если эти инструкции убрать, то чем ARM ISA будет отличаться от МИПСа или RISCV?

----------

по поводу 64 бита - кроме памяти (указателей), это можно 8 байт за раз окучить (с переносом, например), а не 4 - для всякого криптования и т.п. полезно (да - всегда есть хардварная криптомашинка, но если что-то нестандартное), в целочисленной математике иногда в лонг не влазит, нужно лонг лонг. (опять же, лонг в 64х битных бывает 8 байт - пользуйте stdint) и т.д. 

учитывая, что в железе переход с iu32 на iu64 добавляет пренебрежимо мало гейтов (в таких процессорах железо жрут всякие предикторы, лукэхед буфера, кэш контроллеры и т.п. а iu да и float64 вобщем-то малую часть) - то почему бы и нет 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

54 минуты назад, yes сказал:

в целочисленной математике иногда в лонг не влазит, нужно лонг лонг.

Я конечно не спец в DSP алгоритмах, но лонг лонг потребовался в своих задачах всего трижды...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 26.09.2022 в 12:10, yes сказал:

насколько я знаю, ARM рекомендует не использовать STM/LDM инструкции для продвинутых Cortex-A

В ARMv8-a нет этих инструкций, есть только STP/LDP - load/store register pair.

Если юзать NEON можно ворочать сразу по 16 байт (Qx/Vx регистры), но на ARMv7-a тоже самое, кажется?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, sonycman сказал:

но на ARMv7-a тоже самое, кажется?

На сколь помню, там можно сразу 8  32хбитных регистров одной командой...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/26/2022 at 1:12 PM, sonycman said:

В ARMv8-a нет этих инструкций, есть только STP/LDP - load/store register pair.

и в AArch32 архитектуре? в ARMv7 еще было

я не имею опыта с модными АРМами (i.mx6 то есть Cortex-A7/9 последнее, что трогал), интересуюсь "по инерции"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 27.09.2022 в 14:00, yes сказал:

и в AArch32 архитектуре? в ARMv7 еще было

я не имею опыта с модными АРМами (i.mx6 то есть Cortex-A7/9 последнее, что трогал), интересуюсь "по инерции"

Неправильно выразился - в 32 битном режиме есть, конечно, я про 64 бита (aarch64).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 часов назад, mantech сказал:

На сколь помню, там можно сразу 8  32хбитных регистров одной командой...

Намного больше! Там можно 15 целочисленных за раз или 32 FPU-ных за раз.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, jcxz сказал:

Там можно 15 целочисленны

Именно 15, а не 16 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...