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 итераций, разброс уходит почти в ноль.
Вы скорее всего намекаете на то, что он будет использовать умножение и сдвиг. Да, все так, но если он не знает заранее число ему все равно придется использовать деление = )
Хороший поинт, спасибо. Ещё один аргумент в пользу того, что понимание 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 раз хуже.Вы скорее всего намекаете на то, что он будет использовать умножение и сдвиг. Да, все так, но если он не знает заранее число ему все равно придется использовать деление = )