0x1337 – Telegram
0x1337
292 subscribers
6 photos
9 files
19 links
Y0L0 DUD33333
Download Telegram
О обратной связи с автором этого канала, красивых цифрах и просто хвастовстве:
=========================
Phone: +7 987 111 1337
Автомобильный номер вида x777xx
Site: https://1337.xxx
=========================

#callback #contacts
0x1337 pinned «О обратной связи с автором этого канала, красивых цифрах и просто хвастовстве: ========================= Phone: +7 987 111 1337 Автомобильный номер вида x777xx Site: https://1337.xxx ========================= #callback #contacts»
dynamic_cast<void*>(T)
возвращает указатель на 'Самый Производный Класс' в иерархии!

#cxx #interesting
image_2019-09-18_15-24-00.png
29.1 KB
О том, почему компиляторы не так хороши, как тебе говорят^. Фиксится, кстати, заменой uint64_t на int64_t.

#optimization #asm #cxx
0x1337
image_2019-09-18_15-24-00.png
Ну и раз уж пошли такие тЁрки, вот тебе советец:
Работая с RT преобразованиями типов, обязательно проверяй генерируемый ASM код. Особенно, когда речь заходит о преобразованиях знаковых типов в беззнаковые. Интуитивно кажется что с беззнаковыми типами работать быстрее. Однако, это ловушка, которая очень круто показывает себя, например при преобразовании double->uint64_t.

#asm #cxx #missoptimization
Да, ты ведь знаешь, что static_cast<integer_type> из double / float типа, хотя и выполняется compile-time - дает накладные расходы в run-time? Неплохие такие расходы, я бы сказал!

#cxx #optimisation
instruction_tables.pdf
1.2 MB
Вот^ почитай на ночь.

#optimization #cxx #asm
Табличка с замерами Latency / Throughput, которой ну очень удобно пользоваться. Кстати, информация куда более полная чем у Агнера Фога:
https://uops.info/table.html

#optimization #asm
xor R, R - куда больше чем просто зануление регистра R. Дело в том, что процессор 'умный' и видя эту строчку может сделать вывод о том, что все дальнейшие действия с этим регистром не зависят от предыдущих. Другими словами, имея последовательность действий с регистром R, где каждое следующее действие зависит от предыдущего и зависит от R, процессор встретив xor R, R, делает вывод, что все то, что дальше будет происходить с R - не зависит от всего того, что было раньше и, таким образом, вместо того чтобы ждать результат прошлых вычислений, сможет начать выполнять будущие - параллельно, используя Register Renaming, Out - Of - Order Execution техники. Да, у процессора есть виртуальные регистры, к которым имеет доступ он и только он, и эти регистры он может сопоставлять с регистрами общего назначения, подменяя их.

#asm #interesting #optimization
Cortex-A53, увы не умеет в OOR execution, а вот его собрат, Cortex-A57 могЁт. Выбор, конечно очевиден, да и знать полезно.

#interesting
Something like that^

#interesting
Одно дело - разглагольствовать в чатиках и канале, другое - находить конкретные ошибки, весьма конкретных людей с Именем. Настоящим именем^. Ошибаться это нормально, но разве правки - не повод для радости, Приятель?

#asm #peter_cordes
arm_cortex_a55_software_optimization_guide_v3.pdf
558.7 KB
Продолжаем оптимизировать под мобилки^

#optimization_guide_arm_a55 #asm #mobile
fno-verbose-asm - если хотите отключить вывод комментариев в ASM листинге!

#basic #important
Ребята, как я и обещал - радую годным, авторским контентом. Увы, скидывать целиковые статьи, а точнее читать их тут - дело не из простых. Поэтому, сами статьи публикую 'где-то', а сюда скидываю ссылку. Так вот, авторский контент подъехал:

https://habr.com/ru/post/468581/

#publication #asm #cxx #optimization
Однооперандная команда x86 / 64 : {I}MUL{X} R32 / R64 имеет разный latency[3;4], хотя Агнер Фог и рапортует о том, что latency у этой команды постоянен и всегда равен 4 - он ошибается:
Если после команды умножения данной выше мы обращаемся к регистру содержащему младшие биты результата, то latency будет 3, а если обращаемся к старшим - 4.
Речь идет, конечно, о поколении процессоров Intel Sandy Bridge и выше.

#asm #optimization #interesting
Данные в процессор загружаются из памяти. Дело это не быстрое:
https://www.7-cpu.com/
Вот тут^ выбери модель интересующего тебя процессора и посмотри, какова цена работы процессора с 'Голой' памятью. На Haswell, например, 90 clock cycles.

#measurments #ram #processor #link
Продолжая рассуждения на тему обмена данных между Процессором и Памятью:
Есть Out Of Order Execution процессор, есть кусочек кода который подгружает данные из Памяти в Кеш Процессора и как-либо обрабатывает их после, и есть код который отрабатывает ДО места где эти данные загружаются / используются.
Из поста выше мы знаем, что обмен данными между Памятью и Процессором - долог: если на момент пользования обмениваемыми данными, в Кеше Процессора их нету - работа встанет. Процессор, конечно, не дурак и просматривая Фреймы наперед, начнет загрузку данных в Кеш еще до того как они реально понадобятся, параллельно выполняя команды идущие ДО. То есть я к чему: нужно писать код так, чтобы до Работы с Памятью можно было сделать какую-либо полезную Память-Независимую работу, на фоне выполнения которой и будет происходить опережающая выгрузка данных из Памяти.

#memory #cache #prefetching
Также, не забывай, что Кеш в который недавно были загружены нужные данные - Горячий, а кеш в котором этих данных нет - Холодный. И все тесты, бенчмарки и прочее-прочее, лучше проводить на Холодный Желудок, прочищая его от вызова к вызову.

#terminology #cache