sonycman 0 15 сентября, 2022 Опубликовано 15 сентября, 2022 · Жалоба Пробую хвалёный 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 бита сделаны абы как? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 24 сентября, 2022 Опубликовано 24 сентября, 2022 · Жалоба На форуме 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 Почему-то получилось, что гнусь в два раза медленнее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 48 24 сентября, 2022 Опубликовано 24 сентября, 2022 · Жалоба В 15.09.2022 в 12:23, sonycman сказал: Скомпилировал простую програмку в режиме aarch64 В чем принципиальная прелесть этих 64бит? Кроме доступа к большим объемам ОЗУ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 24 сентября, 2022 Опубликовано 24 сентября, 2022 · Жалоба В 24.09.2022 в 21:06, mantech сказал: В чем принципиальная прелесть этих 64бит? Кроме доступа к большим объемам ОЗУ? Не знаю, мне стало интересно, вот и решил глянуть. Наверное, ещё такие камешки могут быстрее ворочать большими объёмами данных? Вообще, машинный код ARMv8-A мне показался больше похожим на MIPS или RISC-V, чем на собственно ARM... :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 26 сентября, 2022 Опубликовано 26 сентября, 2022 · Жалоба насколько я знаю, ARM рекомендует не использовать STM/LDM инструкции для продвинутых Cortex-A компиляторщики, наверно, следуют этой рекомендации... а если эти инструкции убрать, то чем ARM ISA будет отличаться от МИПСа или RISCV? ---------- по поводу 64 бита - кроме памяти (указателей), это можно 8 байт за раз окучить (с переносом, например), а не 4 - для всякого криптования и т.п. полезно (да - всегда есть хардварная криптомашинка, но если что-то нестандартное), в целочисленной математике иногда в лонг не влазит, нужно лонг лонг. (опять же, лонг в 64х битных бывает 8 байт - пользуйте stdint) и т.д. учитывая, что в железе переход с iu32 на iu64 добавляет пренебрежимо мало гейтов (в таких процессорах железо жрут всякие предикторы, лукэхед буфера, кэш контроллеры и т.п. а iu да и float64 вобщем-то малую часть) - то почему бы и нет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 48 26 сентября, 2022 Опубликовано 26 сентября, 2022 · Жалоба 54 минуты назад, yes сказал: в целочисленной математике иногда в лонг не влазит, нужно лонг лонг. Я конечно не спец в DSP алгоритмах, но лонг лонг потребовался в своих задачах всего трижды... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 26 сентября, 2022 Опубликовано 26 сентября, 2022 · Жалоба В 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 тоже самое, кажется? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 48 26 сентября, 2022 Опубликовано 26 сентября, 2022 · Жалоба 4 часа назад, sonycman сказал: но на ARMv7-a тоже самое, кажется? На сколь помню, там можно сразу 8 32хбитных регистров одной командой... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 27 сентября, 2022 Опубликовано 27 сентября, 2022 · Жалоба 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 последнее, что трогал), интересуюсь "по инерции" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 27 сентября, 2022 Опубликовано 27 сентября, 2022 · Жалоба В 27.09.2022 в 14:00, yes сказал: и в AArch32 архитектуре? в ARMv7 еще было я не имею опыта с модными АРМами (i.mx6 то есть Cortex-A7/9 последнее, что трогал), интересуюсь "по инерции" Неправильно выразился - в 32 битном режиме есть, конечно, я про 64 бита (aarch64). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 232 27 сентября, 2022 Опубликовано 27 сентября, 2022 · Жалоба 20 часов назад, mantech сказал: На сколь помню, там можно сразу 8 32хбитных регистров одной командой... Намного больше! Там можно 15 целочисленных за раз или 32 FPU-ных за раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 48 27 сентября, 2022 Опубликовано 27 сентября, 2022 · Жалоба 3 часа назад, jcxz сказал: Там можно 15 целочисленны Именно 15, а не 16 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 232 27 сентября, 2022 Опубликовано 27 сентября, 2022 · Жалоба Именно. SP недопустим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться