Чтобы процессор работал быстрее, обработку команды разбивают на стадии: выборка, декодирование, исполнение, доступ к памяти, запись результата. Конвейер позволяет вести их параллельно для разных команд: пока одна исполняется, следующая уже декодируется, а третья выбирается — как сборочная линия. В идеале каждый такт завершается одна команда.
Память много медленнее ядра, поэтому между ними ставят кэш — быструю буферную память. Часто используемые данные лежат в кэше L1/L2/L3 рядом с ядром; обращение к основной памяти — это «дорогая» операция, и весь дизайн стремится её избегать.
Когда поднимать частоту дальше стало невозможно из-за тепла, перешли к многоядерности: несколько ядер на кристалле работают параллельно. Это требует, чтобы программы умели делиться на параллельные задачи.