Сергей Кузнецов
2009-02-25
Тенденции настоящего, к сожалению, дают все основания ожидать, что в будущем рабство программистов не только сохранится, но и существенно усилится. Пока что на многоядерность процессоров можно закрыть глаза. В конце концов, два или даже четыре ядра благополучно может использовать сама операционная система, ничего не говоря о их наличии пользователям, а просто выполняя на них отдельные, никак не взаимодействующие приложения. Но ведь беда-то в том, что закон Мура продолжает действовать, и теперь, похоже, выражается в геометрическом возрастании числа ядер в микропроцессоре. Что, господа, вы будете делать с 1000-ядерным микропроцессором? Какие услуги должна предоставлять пользователям операционная система компьютера с таким микропроцессором? Что и как будет считаться на таком компьютере?
Нас ставят перед фактом. Производители микропроцессоров делают то, что могут, а получать удовольствие и пользу от их творений придется программистам. Честно скажу, я не знаю, как быть в этой ситуации. По-моему, если вдруг не найдется гений, который придумает, как с пользой для человечества и без риска для жизни программистов использовать эту технику будущего (похоже, не столь уж отдаленного), то компьютерная индустрия просто зайдет в тупик. Утешает только то, что это понятно многим специалистам, а человечество, когда его загоняют в тупик, обычно ухитряется что-то придумать.
В будущем нас ждет еще одна компьютерная проблема – многопоточные (multithreading) микропроцессоры. На аппаратном уровне идея кажется мне замечательной. В современных процессорах основные задержки при выполнении очередной команды возникают в том случае, когда эта команда и/или требуемые для ее данные не обнаруживаются в кэше процессора. В этом случае производится обращение к основной памяти, и длительность этой операции такова, что может привести к остановке всех конвейеров процессора. В многопоточном процессоре на уровне аппаратуры поддерживается несколько потоков управления со своими контекстами. Если в некотором потоке требуется обращение к основной памяти, этот поток блокируется, и производится очень быстрое (однотактовое) переключение процессора на поток управления, готовый к продолжению выполнения. Легко видеть, что при достаточно большом числе потоков управления, поддерживаемых аппаратурой, компьютер, основанный на таком процессоре, будет работать с пиковой скоростью процессора.
В данном случае идея возникла на основе чисто практических потребностей. Как известно, распространенные на сегодняшний день процессоры с кэшем ориентированы на решение задач, отвечающих критерию локальности. Этот критерий состоит в том, что в любой небольшой промежуток времени любая программа обращается к данным, локализованным образом расположенным в памяти. Другими словами, если в кэш перемещается некоторый блок данных, то велика вероятность, что в ближайшее время обращения к основной памяти не понадобятся. Принцип локальности является опорным в аппаратуре, операционных системах и компиляторах.
Однако оказалось, что для ряда важных стратегических проблем человечества принцип локальности не действует. И если такие проблемы (например, мониторинг окружающей среды) пытаться решать на основе сегодняшних компьютеров, то они будут решаться со скоростью не процессоров, а основной памяти. При использовании многопоточного процессора теоретически можно повысить скорость решения таких задач в сотни раз.
Понятно, что для того, чтобы в любой момент времени в процессоре нашелся хотя бы один поток управления, готовый к продолжению выполнения, этих потоков должно быть много (тысячи), а значит, они должны быть очень короткими, по несколько команд. Как получить такую многопоточную программу, непонятно. Явное программирование должно быть просто убийственным, а требуемое автоматическое распараллеливание для традиционных языков программирования невозможно. Может быть, для этих целей удастся использовать функциональные языки программирования, или удастся придумать какую-то новую парадигму.
Пока речь идет о специализированной аппаратуре, предназначенной для решения уникальных задач, это не так уж и важно. Можно представить себе, что такой компьютер будет представлять двухпроцессорный комплекс (или мультипроцессор), один из процессоров которого будет традиционным, и на нем будет работать операционная система со всеми обслуживающими программами, а второй – многопоточный – будет использоваться собственно для решения задачи. Саму уникальную задачу за большие деньги и трудозатраты можно, в конце концов, распараллелить вручную (если, конечно, этому не помешает закон Амдала). И пока соответствующими разработками занимается Cray и другие суперкомпьютерные компании, широкие массы программистов могут спать спокойно, видя сны о компьютерном прогрессе человечества.
Но, пардон, уже слышны известия о многопоточных процессорах от Sun Microsystems. Пускай, это пока не очень серьезно: восьмиядерный процессор Niagara-2 c поддержкой восьми потоков в каждом ядре. Но закон Мура-то действует. И кто знает, не станут ли многоядерные процессоры со временем массовыми. И что мы будем с ними делать? Что такое «универсальная» операционная система для многопотокового процессора? Может ли она вообще существовать? Задачка-то посерьезнее будет, чем для многоядерных однопотоковых процессоров.
Так что и в будущем останемся мы рабами закона Мура, и чтобы перестать быть его рабами, нужно либо научиться хорошо использовать то, что получается у разработчиков процессоров, либо предложить им новые идеи, которые привели бы к архитектурам, более пригодным для программистов. И тогда закон Мура перестанет нас давить, а будет лишь помогать.