Софт
Все компьютерные программы одинаково простые (или сложные, как посмотреть), потому что состоят из довольно ограниченного набора элементарных операций. Их традиционно делят на следующие группы:
- 📼 сохранения и загрузки из памяти
- 🦘перехода между разными частями программы в зависимости от условий
- 🧮 собственно математических операций изменения данных: от очевидных сложения-умножения-деления, до более экзотических вроде «исключающего ИЛИ» и векторизованного умножения с накоплением и насыщением.
Каждую из таких операций производитель процессора сопровождает маленькой электрической схемой (или микропрограммой прямо внутри процессора), позволяющей эту операцию произвести. Это называется аппаратной поддержкой. И поскольку изготовитель процессора решает чтó именно он добавит внутрь своей новой железки, то спектр поддерживаемых операций в зависимости от устройства очень разнится. В особо запущенном случае мне приходилось программировать на процессоре, у которого даже операции деления не было. Если бы такая операция была, то разделить одно число на другое — плёвое дело, микросекунда работы. А вот если её нет… Придётся конвертировать одно деление в сотни, а то и тысячи инструкций сложения-вычитания-умножения.
Так что с точки зрения софта ответ простой: если в процессоре нет соответствующего аппаратного блока, который может выполнить нужную операцию, то, кажется, у программиста проблемы.
Железо
Однако производители железа обычно добренькие и прислушиваются к желаниям потребителей и со временем добавляют всё больше и больше фишек прямиком в процессор. Вот лишь несколько вещей, которые на моей памяти нашли свою путь под одну крышку с центральным процессором:
- быстрая кэш-память. Да, когда-то внутри процессора было памяти не больше, чем в бухгалтерском калькуляторе, и приходилось за любым чихом ходить «наружу».
- со-процессор для операций с дробными числами (Floating Point Unit, FPU). Процессор моего первого ПК был из первой серии Intel, в которой они сумели запихнуть целый FPU внутрь процессора, вместо отдельной микросхемы серии x87.
- встроенная внутрь процессора видеокарта может и не впечатлит привередливого геймера, но будет достаточна для большинства пользователей ПК. AMD настолько довольна получившимся результатом, что теперь называет свои процессоры не иначе как APU (Accelerated processor unit, разогнанный процессор 🤷♂️)
- аудио-видео кодеки. Я застал времена, когда единственное ядро процессора разгонялось до 80%-нагрузки, проигрывая свежий MP4-рип роскошных 720 на 480 пикселей качества. Мой нынешний ноутбук может декодировать 30 (!) 4K видео потоков в реальном времени. А нагрузка всех остальных отделов процессора останется на нуле.
- нейронные процессоры. Это такие специализированные железки, чтобы энергоэффективно исполнять некоторые матричные операции, используемые для задач распознавания картинок и текста. Их интеграция как раз сейчас в процессе, и в массовый сегмент они заходят в первую очередь на мобильных устройствах.
Бесконечная специализация
Как видно из этого рассказа, софт и железо на всём протяжении истории вычислительной техники идут рука об руку. Когда-то в основе любого компьютера был простейший калькулятор, умеющий только в плюс-минус-умножить. С годами процессоры обрастают всё большим количеством узкоспециализированных узлов: от аппаратных
шейдеров и
трассировщиков лучей, до видео-кодеков
H265 и
нейро-сетевых моделей. В наиболее общем виде процесс взаимного влияния (или «программно-аппаратной конвергенции», если хочется звучать красиво) выглядит так:
- появляется сложная математическая теория, которая решает насущную практическую задачу, кто-то получает (не одну) докторскую
- программисты превращают теорию в программу, которая исполняется целиком на ЦПУ и съедает все его ресурсы (или память, или и то, и другое)
- специалисты по железу выпускают (относительно) внешнее устройство, внутрь которого зашито аппаратное решение этой задачи
- на следующем цикле аппаратное решение появляется в виде опции прямо внутри ЦПУ и за бóльшие деньги, в сравнении с обычной версией
- наконец, подавляющее большинство ЦПУ выпускается с аппаратным модулем и это воспринимается как норма.
Другими словами, обычный цикл внедрения инновации. Интересно в этой истории то, что старые инновации зачастую остаются с нами и обогащают пространство возможностей компьютеров.
Так что самая трудная задача и для софта, и для железа эта та, которую ещё не успели решить (то есть, та, что на этапах 1-2-3).