Pull to refresh
4K+
16
6
Rating
4
Subscribers
Send message

Хороший поинт, спасибо. Ещё один аргумент в пользу того, что понимание asm нужно даже тем, кто пишет на intrinsics.

Intrinsics — это по сути тот же asm, завёрнутый в C-синтаксис. Вы не ушли от asm, вы сменили обёртку) А 5% — это не только SIMD оптимизации. Это ядра ОС, UEFI, переключение контекста, обработчики прерываний, криптография — вещи, где intrinsics не помогут. Но вы безусловно правы, что кода на asm нужно сильно меньше, чем на C.

В одном только ядре Linux — больше миллиона строк asm, 5000+ контрибьюторов. По Stack Overflow 2024, ~5% профессиональных разработчиков регулярно используют asm — это десятки тысяч человек. По моим прикидкам, людей, которые регулярно пишут asm — тысячи, не сотни. Так что область живее всех живых.

P.S. LLM рано или поздно со всем справится, не только с asm xD

Нужно гораздо больше, чем кажется)) Есть архитектурный слой, который ну никак не выкинуть, ну вот хоть ты тресни — железо разное, процессоры разные. Это фундаментальный вызов разнообразия железа. Собственно потому и появился C — как попытка скрыть железо за более высокими абстракциями. И он хорошо справляется. Но не везде и не всегда.

Полностью согласен. Более того, есть специфика архитектуры и мы никуда от нее не уйдем. Всегда будет архитектурно специфичный слой. Это фундаментально. А что Вы писали, если не секрет? И почему именно под эту микроархитектуру?

Для SEC — нет, не получится. Начиная с PEI — уже можно на C. SEC на asm по двум причинам: во-первых, стека нет. Во-вторых, архитектурно-специфичный код — переключение в защищённый режим, потом в 64-битный. Это делается через специальные регистры (CR0, MSR, GDT), для которых нужны конкретные инструкции.

Точно навсегда. Вот банально взять UEFI — у него есть SEC фаза. Вся эта фаза на чистом asm, потому что стек ещё не инициализирован. Компилятор C не может работать без стека. Собственно инициализация стека и есть одна из задач SEC. Ну и в целом она архитектурно-специфична.

Интересные замеры! Но есть нюанс: rdtscp внутри цикла — сериализующая инструкция, она сбрасывает pipeline. Плюс между каждым div — десяток инструкций overhead (cmp, cmov, pop, loop). Получается измеряется не столько div, сколько div + overhead + два pipeline flush. Отсюда и разброс — pipeline каждую итерацию прогревается заново. Если вынести rdtsc наружу и гонять 2M итераций, разброс уходит почти в ноль.

Спасибо! Рад, что зашло.

loop на Skylake/Coffee Lake — микрокодированная инструкция: 7 µops, throughput 5 тактов. dec + jnz с macro-fusion — 1 µop, 1 такт. В 5 раз хуже.

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

Information

Rating
953-rd
Registered
Activity