Тысячи ядер: когерентность кэшейТеме номера посвящены четыре крупные статьи, а приглашенным редактором подборки является Сринивас Девадас (Srinivas Devadas), представивший вводную заметку «На пути к модели когерентной памяти для многоядерных процессоров» (Toward a Coherent Multicore Memory Model). В последнее десятилетие ограничения теплоотдачи приостановили повышение тактовой частоты процессоров, но плотность транзисторов продолжает расти — эксперты предсказывают появление в ближайшие десять лет процессоров c более чем тысячей ядер. Для дальнейшего повышения производительности нужны новые архитектуры многоядерных процессоров среднего и крупного масштаба, такие как Raw, TRIPS и Execution Migration Machine, а пока индустрия предлагает архитектуры и проекты Tilera, Intel TeraFLOPS и Intel Phi. Однако можно ли будет эффективно программировать для процессоров с громадным числом ядер? Хотя архитектуры с моделями ограниченного доступа к памяти (большей частью графические процессоры) успешно используются в конкретных приложениях (например, в области визуализации), большинство программистов предпочитает модель общей памяти, и в коммерческих многоядерных процессорах поддерживается именно эта модель.

Основной вопрос состоит в том, каким образом можно обеспечить когерентную общую память при наличии сотен или даже тысяч ядер? В каждом из этих ядер обычно будут иметься кэши первого и второго уровней, поскольку требования к энергопитанию кэша возрастают в квадратичной зависимости от его размера. Следовательно, единственным путем к реализации крупного кэша является его физическое распределение по кристаллу — так, чтобы каждое ядро располагалось поблизости от некоторой части кэша.

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

Для числа ядер, при котором не работают шинные механизмы, традиционным подходом к созданию общей памяти является поддержка когерентности на основе справочников. При этом логически центральный справочник координирует совместное использование частных кэшей ядер, а каждое ядро должно согласовывать возможность совместного (только по чтению) или монопольного (по чтению и записи) доступа к каждому кэшу на основе протокола поддержки когерентности. Однако и при использовании справочников возникают проблемы — в частности, поддержка когерентности может порождать значительный трафик, приводящий к росту задержек, перегрузке соединений и повышению уровня энергопотребления.

Первую регулярную статью «Влияние динамических справочников на сеть соединений многоядерных процессоров» (The Impact of Dynamic Directories on Multicore Interconnects) представили Абхишек Дас (Abhishek Das), Мэттью Шукхард (Matthew Schuchhardt), Никос Хардавеллас (Nikos Hardavellas), Гохан Мемик (Gokhan Memik) и Алок Чоудхари (Alok Choudhary). Для борьбы с внутрикристальными задержками, увеличивающимися по мере роста числа ядер и размеров кэшей, архитектуры многоядерных процессоров делаются более распределенными. Например, в процессорах Intel Xeon Phi и Tilera TILE-Gx внутрикристальный кэш верхнего уровня разделяется на несколько частей, распределенных по кристаллу вместе с ядрами. Для поддержки передачи данных и коммуникаций между ядрами в таких процессорах используется сложная внутрикристальная сеть соединений, потребляющая 10–28% всей энергии, которая питает многоядерный процессор. При дальнейшем росте числа ядер эта доля будет только возрастать.

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

Требование когерентности появляется из-за оптимизации производительности доступа к данным. Для обеспечения более быстрого доступа части распределенного кэша обрабатываются как частные кэши соседних ядер. В результате образуются «плитки», каждая из которых содержит ядро и часть кэша. Когерентность данных в этих кэшах поддерживается на основе протокола когерентности с использованием распределенного справочника, адреса в котором чередуются между плитками. Однако в этом чередовании адресов не учитываются доступы к данным и паттерны их совместного использования. Часто случается так, что блок кэша отображается в часть справочника в плитке, которая физически удалена от ядер, обращающихся к соответствующим данным. Для обеспечения совместного использования блока кэша, ядра должны много раз проходить по сети соединений кристалла для общения со справочником вместо того, чтобы общаться напрямую. Эти излишние проходы порождают дополнительный трафик и увеличивают энергопотребление (рис. 1).

Рис. 1. Трафик совместного использования данных в основных архитектурах многоядерных процессоров: a — поток пакетов в случае, когда плитка № 7 запрашивает данные из блока, которым владеет плитка № 5; б — поток пакетов в случае, когда каталог размещается вместе с данными
Рис. 1. Трафик совместного использования данных в основных архитектурах многоядерных процессоров: a — поток пакетов в случае, когда плитка № 7 запрашивает данные из блока, которым владеет плитка № 5; б — поток пакетов в случае, когда каталог размещается вместе с данными

 

Компания Tilera в своем процессоре TILEPro64 реализовала механизм, способствующий сокращению трафика при общении со справочником за счет того, что программное обеспечение получает возможность назначать каждой странице кэша «домашнюю» плитку. Этот метод похож на метод динамических справочников, где аппаратура вместе с операционной системой устраняет потребность в размещении элементов справочника в предопределенных плитках. Хотя в TILEPro64 поддерживается механизм размещения, разработчики не выступают в поддержку какой-либо конкретной политики размещения. Кроме того, нет оценок эффективности этого метода.

Авторы статьи оценивают влияние динамических справочников на производительность многоядерных процессоров и энергопотребление. Демонстрируется эффективность метода при использовании простой политики замещения элементов справочника, когда эти элементы располагаются поблизости от ядер, наиболее активно совместно использующих соответствующие блоки кэша.

Следующую статью «Ориентированный на приложения подход к аппаратной поддержке когерентности кэшей» (An Application-Tailored Approach to Hardware Cache Coherence) написали Арвинд Шрираман (Arrvindh Shriraman), Хонжу Жао (Hongzhou Zhao) и Сандхия Дваркадас (Sandhya Dwarkadas). Проектировщики микропроцессоров продолжают искать способы поддержки модели когерентной памяти при постоянном возрастании числа ядер и специализированных ускорителей. Обычно аппаратная реализация когерентности кэша при наличии многочисленных ядер и ускорителей значительно усложняет и удорожает архитектуру, поэтому во многих графических и многоядерных процессорах (например, в Intel Single-Chip Cloud Computer) используется технология управления сверхбыстродействующей памятью, требующая программно-управляемого перемещения и хранения данных. Однако ни один из подходов не обеспечивает явного выигрыша в производительности. С одной стороны, аппаратная поддержка когерентности кэша связана с накладными расходами на хранение метаданных, с поддержкой дополнительного трафика во внутрикристальной сети соединений, с соответствующим ростом энергопотребления и коммуникационными задержками. Эти расходы обычно растут с увеличением числа ядер и потенциального объема кэшируемых данных. С другой стороны, любое преимущество программного управляемого кэша может происходить только из возможности приспосабливаться под особенности конкретных приложений, а вовсе не из того, что при этом устраняется потребность в аппаратной поддержке когерентности. Теоретически можно было бы обеспечить настройку под особенности приложений и при аппаратной реализации. Тем не менее от потребности поддержки внутрикристальной когерентности кэша никуда не деться, и авторы полагают, что накладные расходы аппаратной поддержки когерентности связаны не с родовыми свойствами модели, а с желанием архитекторов обеспечить гарантии когерентности в худшем случае и с жесткостью имеющихся аппаратных реализаций. Правильно разработанный протокол поддержки когерентности позволяет избежать излишних коммуникаций, с тем чтобы и управляющие сообщения, и пересылки данных соответствовали поведению выполняемого приложения. В то же время такой протокол не должен приводить к потребности хранения излишних метаданных.

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

Авторами статьи «Однотактный многопрыжковый асинхронный повторяющийся обход: будущее внутрикристальных сетей с использованием подхода SMART» (Single-Cycle Multihop Asynchronous Repeated Traversal: A SMART Future for Reconfigurable On-Chip Networks) являются Тушар Кришна (Tushar Krishna), Чиа-Син Овен Чен (Chia-Hsin Owen Chen), Сонхен Пак (Sunghyun Park), Ву-Чел Кон (Woo-Cheol Kwon), Сувинай Субраманиан (Suvinay Subramanian), Ананта Чандракасан (Anantha P. Chandrakasan), Ли Чиуан Пе (Li-Shiuan Peh). В современных архитектурах многоядерных процессоров применяется масштабируемая топология сети (например, сетка — mesh), поддерживающая коммуникации между ядрами. Масштабируемая внутрикристальная сеть соединяет ядра проводной сеткой, которая содержит узловые коммутаторы (crosspoint router), управляющие потоком коммуникаций, обеспечивая совместное использование сегментов линий связи и буферизуя сообщения при возникновении конфликтов. Наименьшие компоненты сетевых сообщений («флиты», flit) обходят ряд сегментов маршрутизаторов и линий связи («прыжков» или «хопов») на пути от источника сообщения к месту его назначения. Длина хопа каждого флита равняется ширине плитки — расстоянию между двумя маршрутизаторами. В последние десять лет исследователям микропроцессорных архитектур удалось снизить величину задержки конвейера маршрутизатора до одного такта, однако при возрастании числа ядер задержка растет, что ухудшает пропускную способность и вызывает общее замедление системы. По этой причине разработчики протоколов поддержки когерентности кэшей предпочитают архитектуры с частными кэшами второго уровня, а программисты и разработчики компиляторов и операционных систем стараются располагать данные поблизости от ядер, отвечающих за их совместное использование. Но этим возможности протоколов и программного обеспечения ограничиваются — в конце концов, у каждого ядра имеется ограниченное число односкачковых соседей, и чем больше имеется ядер, тем больше хопов требуется для передачи сообщения по внутрикристальной сети. При имеющихся сегодня ограничениях попытка разработать чип с 1024 ядрами приведет к возникновению ужасающей задержки и расходу энергии.

Авторы статьи предлагают парадигму многопрыжкового однотактного асинхронного повторяющегося обхода (multihop asynchronous repeated traversal, SMART), позволяющую за счет создания однотактных многопрыжковых маршрутов сократить задержки. Основная идея состоит в асинхронном пропуске сигнала через несколько маршрутизаторов и линий связи без блокировок (рис. 2). Оценки показывают, что SMART может на 61% уменьшить трафик системы на кристалле и на 50–57% — трафик, требуемый для поддержки когерентности кэшей второго уровня.

Рис. 2. Пример SMART для трех сценариев трафика: a, б и в. Все выделенные многопрыжковые пути обходятся за один такт. Для приложения в пути раскрашены — красный и зеленый пути конкурируют за общую линию связи между маршрутизаторами 5 и 9
Рис. 2. Пример SMART для трех сценариев трафика: a, б и в. Все выделенные многопрыжковые пути обходятся за один такт. Для приложения в пути раскрашены — красный и зеленый пути конкурируют за общую линию связи между маршрутизаторами 5 и 9

 

Завершает тематическую подборку статья «На пути к многоядерным процессорам с общей памятью, устойчивым к единичным неисправностям» (Toward Holistic Soft-Error-Resilient Shared-Memory Multicores), авторами которой являются Кинчуан Ши (Qingchuan Shi) и Омер Хан (Omer Khan). Закон Мура позволяет интегрировать в одной микросхеме многие миллиарды транзисторов, однако это сопровождается все большей неустойчивостью процессов функционирования микросхем, а также усугубляет проблемы старения и надежности. Процессоры должны обеспечивать высокую производительность в условиях ограниченного энергоснабжения, но серьезную проблему для будущих компьютерных систем вызывают единичные неисправности. Неустойчивые искажения логических значений могут привести к заметным для пользователя эффектам — от ошибок программного обеспечения, возникновения синхронизационных тупиков на уровнях приложений, протоколов и аппаратуры до полного отказа системы. Разработчики микросхем не могут справиться с такими ошибками на основе тестирования и вынуждены полагаться на методы поддержки устойчивости во время работы микросхем.

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

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

Рис. 3. Архитектура устойчивого к единичным сбоям многоядерного процессора с общей памятью
Рис. 3. Архитектура устойчивого к единичным сбоям многоядерного процессора с общей памятью

 

Вне тематической подборки опубликованы две крупные статьи. Статью «Количественная оценка влияния программного обеспечения» (Quantifying Software’s Impact) написали Михаэль ван Генухтен (Michiel van Genuchten) и Лес Хэттон (Les Hatton). После прихода в 1980-е годы программного обеспечения к власти компьютерная индустрия необратимо изменилась. Развитие ПО продолжает оказывать влияние на целый ряд индустрий (от автомобилестроения до здравоохранения), воздействуя на жизнь большинства людей. Для получения количественной оценки влияния ПО на различные индустрии авторы статьи завели в 2010 году в журнале IEEE Software рубрику, в которой публиковались заметки авторитетных представителей этой области. Задача рубрики была в сборе данных для составления карты программного обеспечения, настолько же точной, насколько точны были карты Земли, составленные путешественниками с XV по XVII век: в принципе приемлемой, но не обязательно аккуратной с топографической точки зрения. В данной статье подводится итог полученной информации.

Рис. 4. Объем программного обеспечения, используемого в различных индустриях
Рис. 4. Объем программного обеспечения, используемого в различных индустриях

 

Последняя крупная статья номера называется «Защита критических систем управления в XXI веке» (Critical Control System Protection in the 21st Century), ее написали Кристина Алкараз (Cristina Alcaraz) и Шерали Зидалли (Sherali Zeadally). Сегодня ИТ играют первостепенную роль в реализации, функционировании и поддержке особо важных инфраструктур (вода, энергия, продукты питания, газ, электричество и т. д.). Для многих таких инфраструктур необходимо наличие критических систем управления, называемых также системами диспетчерского контроля и сбора данных (Supervisory Control And Data Acquisition, SCADA). Отдельные люди, компании и правительственные организации в своей повседневной деятельности полагаются именно на эти критические системы управления. Нарушения в их работе могут привести к серьезным социальным и экономическим последствиям национального масштаба — в основном из-за наличия сильных связей между разными особо важными инфраструктурами. Для обеспечения высокой эффективности, надежности и безопасности таких объектов необходимо разработать и внедрить меры для их защиты. Это ведет к образованию новой области исследований, которую часто называют защитой особо важных инфраструктур. В статье описываются основные задачи, стоящие перед исследователями в этой области.

До новой встречи, с уважением, Сергей Кузнецов (kuzloc@ispras.ru), профессор, МГУ (Москва).