Скачиваний:
62
Добавлен:
30.03.2015
Размер:
107.01 Кб
Скачать

Вторая ось — связанность по данным. в идеале было бы замечательно, если бы каждый фрагмент работал со своим собственным автономным фрагментом данных, в таком случае все сводится к оптимальной загрузке ядер потоками команд и исключено явление, называемое «гонкой данных» (data race), но в реальной жизни независимость по данным встречается не часто. Можно выделить три типа параллелизма.

Независимый параллелизм (Independent parallelism). В этом случае одна или несколько операций прилагаются независимо друг от друга к одному и тому же фрагменту данных. По степени гранулярности задачи с независимым параллелизмом могут распределяться от простейших действий над массивами данных до поисковых машин или систем моделирования методом конечного элемента в строительной механике и им подобных. Регулярный параллелизм (Regular parallelism). Этот вид параллелизма относится к регулярным структурам, он предполагает, что между изменениями фрагментов данных есть логическая, или функциональная, зависимость. Неструктурированный параллелизм (Unstructured parallelism). Не предполагает какой-либо взаимозависимости между отдельными фрагментами данных. Последний тип данных является наиболее общим; для работы с ними обычно использовались различного рода технологии с блокировками. Основная проблема, сопровождающая блокировки, заключается в том, что не существует точных указаний, как их следует делать, все определяется избранной программистом дисциплиной, он должен помнить о существовании соответствующих блокировок при обращении к тем или иным данным. Кроме того, блокировки плохо поддаются локализации, поэтому все, кто обращаются к данным, должны помнить о них и учитывать факт их существования.

На данный момент по отношению к блокировкам существует два основных альтернативных подхода. Первый подход называют «программированием, свободным от блокировок». В основе этого подхода лежит глубокое понимание модели памяти, реализованной в процессоре, оно позволяет создавать такие структуры данных, которые обеспечивают распределенное использование данных без блокировок. Недостатком этого подхода является его трудоемкость и невысокая надежность.

Второй подход получил название «программная транзакционная память» (Software Transactional Memory, STM). В его основе лежит механизм обмена транзакциями, аналогичный тому, который используется в базах данных. В конце 80-х годов возникла идея переноса принципов STM на аппаратное обеспечение, но практические результаты получены только в последние годы. Есть основания полагать, что процессоры наподобие Rock будут комплектоваться памятью с железной реализацией транзакционного механизма.

Свою статью Саттер заключает тем, что показывает несоответствие требованиям параллелизма популярных императивных коммерческих языков (Паскаль, Си, C++, Java, C#), более новых функциональных языков (Scheme, ML, Haskell), иных инструментальных средств. В этой области есть определенные академические наработки, однако потребуется время на то, чтобы они были доведены до уровня коммерческих продуктов.

Многоядерное будущее

Эволюция технологий связана с количественными и качественными переходами. Парусники заменили пароходы, поршневые двигатели самолетов уступили место турбинам и т.д. Каждый такой переход сопровождается созданием новых инженерных и научных школ. Нечто подобное являют собой многоядерные процессоры. Черты этой революционной парадигмы пока еще только вырисовываются.

Многоядерность — история и перспективы

Идея перехода на многоядерные процессоры стала овладевать умами масс специалистов в области ИТ совсем недавно, примерно начиная с 2005 года, но на самом деле она далеко не так нова. Еще в далекие 60-е годы преимущества нескольких процессорных ядер перед одним обосновал Сеймур Крей, затем он реализовал свой замысел в суперкомпьютере CDC 6600. Но в силу консервативности взглядов проектировщиков, вызванных технологическими ограничениями (например, компьютерные платы собирались навесным монтажом из триодов, конденсаторов, сопротивлений и прочих дискретных компонентов), дальнейшего развития этот подход к проектированию центрального процессорного пстройства не получил.

За возрождение многоядерности на современном технологическом уровне, как и за многие другие новации, мы должны быть благодарны инженерам корпорации Digital Equipment. Именно здесь во второй половине 90-х всерьез, на промышленном уровне, задумались о многоядерности в микропроцессорах; это произошло при переходе процессора от Alpha 21164 (EV5) к Alpha 21264 (EV6). Тогда исследователям из DEC удалось установить две важные закономерности, распространяющиеся на процессоры. Во-первых, оказалось, что для линейного роста производительности монолитных (одноядерных) процессоров требуется обеспечить квадратичный рост числа транзисторов. Во-вторых, как следствие, также нелинейно (хотя и трудно сказать, как именно) возрастет сложность проектирования. Элементарное рассуждение подсказывает, что суммирование производительности нескольких ядер даст ту же совокупную производительность, что и одно ядро при меньшем числе транзисторов. Вопрос в том, как объединить мощности отдельных ядер, в этом состоит коренная проблема многоядерности. Реакцией DEC на обнаруженные проблемы стал проект Piranha, предполагавший создание 8-ядерного процессора, где каждое ядро должно было иметь отдельную кэш-память для команд и данных, для совместной работы процессоры объединялись коммутатором. Однако после перехода в ведение Compaq проект Piranha был похоронен, процессор так и не был реализован.

Низкая эффективность использования транзисторов, когда большая их часть отдается схемам управления и существенно меньшая — выполнению собственно арифметических и логических операций, и, как следствие, высокое энергопотребление, стали главным тормозом на пути дальнейшего развития монолитных процессоров. Весьма наглядной иллюстрацией происходящего стало явление, получившее название «разрыв Мура» (The Moore’s gap). Сложность проектирования увеличивает время проектирования некоторых наиболее сложных процессоров до неприемлемых значений; в некоторых случаях период проектирования затягивается больше чем на десятилетие. Характерный пример — прогноз выпуска серверов архитектуры IA-64. На пороге третьего тысячелетия перспектива серверного микропроцессора казалась многим очевидной; будущая монополия Itanium (тогда проект еще назывался Merced) не вызывала сомнения, открытым оставался лишь вопрос о времени ее появления. Практические же результаты оказались столь скромными, что дали основания скептикам с издевкой называть процессор не иначе как Itanic. Рынок серверов инерционнее рынка рабочих станций, поэтому, чтобы увидеть будущее, стоит смотреть на изменения, происходящие во втором сегменте. Примерно три-четыре года назад исчезли рабочие станции на Itanium, это явный знак судьбы этого процессора. Параллельно с проектом Piranha группа исследователей из Стэндфордского университета во главе с Кунле Олокотуном работала над «многоголовым процессором» Hydra, весьма образно названным именем чудовища, с которым сражался Геракл. В качестве ядра использовался процессор MIPFS 4600. Работа (заметим, спонсировавшаяся агентством DARPA) дала хорошие результаты. Как обычно бывает в таких случаях, проект перевели на коммерческую основу, создали небольшую фирму Afara, которую возглавил тот же Олокотун. Впоследствии, проявив изрядную прозорливость, причем в далеко не самые простые для себя времена, Sun Mirosystems купила эту компанию и, заменив ядро MIPFS 4600 на UltraSPARC II и увеличив число ядер вдвое, выпустила экспериментальный процессор Niagara, получивший в серии наименование UltraSPARC T1.

Успеху Niagara способствовало и то, что в Sun велась собственная разработка двухъядерного процессора MAJC 5200, где каждое ядро способно обрабатывать четыре потока команд. Процессор UltraSPARC T1 является конвергенцией Hydra и MAJC 5200.

Процессоры SPARC вообще и UltraSPARC T1 в частности являются суперскалярными, а в Power от IBM еще используется метод внеочередного исполнения. Первым процессором с двумя ядрами стал Power4 (два ядра Power3), за ним последовал Power5, а на горизонте тоже двухъядерный Power6. Может показаться странным, но у IBM разработки многоядерных процессоров заметно связаны с производством игр. Так, процессор Xenon предназначен для игровой консоли, которая, как предполагается, придет на смену Xbox 360, он будет иметь три ядра PowerPC, где каждое ядро будет поддерживать два симметричных аппаратных потока. Другой проект, Cell, включает двухпотоковое ядро SMT Power и восемь ядер, которые называют синергетическими процессорными элементами (Synergistic Processing Element, SPE), работающими по принципу SIMD. Основное ядро Power выполняет команды из системы команд PowerPC, поддерживая специализированную систему команд SPE. С очевидным опозданием свои предложения сделали корпорации AMD и Intel: борьба на многоядерном поле стала и для производителей процессоров архитектуры x86 одним из самых актуальных вопросов сегодняшнего дня.

Отдельную нишу в «многоядерном пространстве» занимают компании, производящие процессоры для коммуникационных устройств, в том числе Broadcom SiByte, Raza Microelectronics, Cavium Networks, Octeon. Через несколько лет многоядерные процессоры станут обыденностью: проблемы конструирования и поддержки средствами полупроводниковых технологий решаются достаточно просто, в этом собственно и состоит одно из достоинств. Компании, производящие процессоры, это прекрасно понимают, но они также понимают, что гораздо сложнее другое — адаптировать их для работы с существующими приложениями. Поэтому выбор момента и методов перехода на новые рельсы так сложен и ответствен. Если выстрелить слишком рано, можно опередить рынок, но, с другой стороны, слишком позднее решение может обернуться большим ущербом.