dynamic_cast<void*>(T)
возвращает указатель на 'Самый Производный Класс' в иерархии!#cxx #interesting
image_2019-09-18_15-24-00.png
29.1 KB
О том, почему компиляторы не так хороши, как тебе говорят^. Фиксится, кстати, заменой uint64_t на int64_t.
#optimization #asm #cxx
#optimization #asm #cxx
0x1337
image_2019-09-18_15-24-00.png
Ну и раз уж пошли такие тЁрки, вот тебе советец:
Работая с RT преобразованиями типов, обязательно проверяй генерируемый ASM код. Особенно, когда речь заходит о преобразованиях знаковых типов в беззнаковые. Интуитивно кажется что с беззнаковыми типами работать быстрее. Однако, это ловушка, которая очень круто показывает себя, например при преобразовании double->uint64_t.
#asm #cxx #missoptimization
Работая с RT преобразованиями типов, обязательно проверяй генерируемый ASM код. Особенно, когда речь заходит о преобразованиях знаковых типов в беззнаковые. Интуитивно кажется что с беззнаковыми типами работать быстрее. Однако, это ловушка, которая очень круто показывает себя, например при преобразовании double->uint64_t.
#asm #cxx #missoptimization
Да, ты ведь знаешь, что static_cast<integer_type> из double / float типа, хотя и выполняется compile-time - дает накладные расходы в run-time? Неплохие такие расходы, я бы сказал!
#cxx #optimisation
#cxx #optimisation
Табличка с замерами Latency / Throughput, которой ну очень удобно пользоваться. Кстати, информация куда более полная чем у Агнера Фога:
https://uops.info/table.html
#optimization #asm
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
#asm #interesting #optimization
Cortex-A53, увы не умеет в OOR execution, а вот его собрат, Cortex-A57 могЁт. Выбор, конечно очевиден, да и знать полезно.
#interesting
#interesting
Одно дело - разглагольствовать в чатиках и канале, другое - находить конкретные ошибки, весьма конкретных людей с Именем. Настоящим именем^. Ошибаться это нормально, но разве правки - не повод для радости, Приятель?
#asm #peter_cordes
#asm #peter_cordes
Ребята, как я и обещал - радую годным, авторским контентом. Увы, скидывать целиковые статьи, а точнее читать их тут - дело не из простых. Поэтому, сами статьи публикую 'где-то', а сюда скидываю ссылку. Так вот, авторский контент подъехал:
https://habr.com/ru/post/468581/
#publication #asm #cxx #optimization
https://habr.com/ru/post/468581/
#publication #asm #cxx #optimization
Хабр
Делись, рыбка, быстро и нацело
Деление — одна из самых дорогих операций в современных процессорах. За доказательством далеко ходить не нужно: Agner Fog[ 1 ] вещает, что на процессорах Intel / AMD мы легко можем получить Latency в...
Hey, dudes, here i wrote some interesting stuff about how can u do your integer divisions - faster. Pls. check this:
https://habr.com/ru/post/468581/
#publication #asm #cxx #optimization
https://habr.com/ru/post/468581/
#publication #asm #cxx #optimization
Хабр
Делись, рыбка, быстро и нацело
Деление — одна из самых дорогих операций в современных процессорах. За доказательством далеко ходить не нужно: Agner Fog[ 1 ] вещает, что на процессорах Intel / AMD мы легко можем получить Latency в...
Однооперандная команда x86 / 64 : {I}MUL{X} R32 / R64 имеет разный latency[3;4], хотя Агнер Фог и рапортует о том, что latency у этой команды постоянен и всегда равен 4 - он ошибается:
Если после команды умножения данной выше мы обращаемся к регистру содержащему младшие биты результата, то latency будет 3, а если обращаемся к старшим - 4.
Речь идет, конечно, о поколении процессоров Intel Sandy Bridge и выше.
#asm #optimization #interesting
Если после команды умножения данной выше мы обращаемся к регистру содержащему младшие биты результата, то latency будет 3, а если обращаемся к старшим - 4.
Речь идет, конечно, о поколении процессоров Intel Sandy Bridge и выше.
#asm #optimization #interesting
Данные в процессор загружаются из памяти. Дело это не быстрое:
https://www.7-cpu.com/
Вот тут^ выбери модель интересующего тебя процессора и посмотри, какова цена работы процессора с 'Голой' памятью. На Haswell, например, 90 clock cycles.
#measurments #ram #processor #link
https://www.7-cpu.com/
Вот тут^ выбери модель интересующего тебя процессора и посмотри, какова цена работы процессора с 'Голой' памятью. На Haswell, например, 90 clock cycles.
#measurments #ram #processor #link
Продолжая рассуждения на тему обмена данных между Процессором и Памятью:
Есть Out Of Order Execution процессор, есть кусочек кода который подгружает данные из Памяти в Кеш Процессора и как-либо обрабатывает их после, и есть код который отрабатывает ДО места где эти данные загружаются / используются.
Из поста выше мы знаем, что обмен данными между Памятью и Процессором - долог: если на момент пользования обмениваемыми данными, в Кеше Процессора их нету - работа встанет. Процессор, конечно, не дурак и просматривая Фреймы наперед, начнет загрузку данных в Кеш еще до того как они реально понадобятся, параллельно выполняя команды идущие ДО. То есть я к чему: нужно писать код так, чтобы до Работы с Памятью можно было сделать какую-либо полезную Память-Независимую работу, на фоне выполнения которой и будет происходить опережающая выгрузка данных из Памяти.
#memory #cache #prefetching
Есть Out Of Order Execution процессор, есть кусочек кода который подгружает данные из Памяти в Кеш Процессора и как-либо обрабатывает их после, и есть код который отрабатывает ДО места где эти данные загружаются / используются.
Из поста выше мы знаем, что обмен данными между Памятью и Процессором - долог: если на момент пользования обмениваемыми данными, в Кеше Процессора их нету - работа встанет. Процессор, конечно, не дурак и просматривая Фреймы наперед, начнет загрузку данных в Кеш еще до того как они реально понадобятся, параллельно выполняя команды идущие ДО. То есть я к чему: нужно писать код так, чтобы до Работы с Памятью можно было сделать какую-либо полезную Память-Независимую работу, на фоне выполнения которой и будет происходить опережающая выгрузка данных из Памяти.
#memory #cache #prefetching
Также, не забывай, что Кеш в который недавно были загружены нужные данные - Горячий, а кеш в котором этих данных нет - Холодный. И все тесты, бенчмарки и прочее-прочее, лучше проводить на Холодный Желудок, прочищая его от вызова к вызову.
#terminology #cache
#terminology #cache