Приветствую, на связи снова Сергей Баширов, ведущий разработчик из R&D-команды Cloud.ru. Недавно я посетил очередной Compute, Memory, and Storage Summit, на котором было довольно много докладов на тему Compute Express Link (CXL). В статье сделал краткую выжимку из выступлений, а также поделился своими наблюдениями и выводами. Рассказал, чем полезна CXL и как устроена эта технология, разобрал сценарии применения в облачной инфраструктуре, а также поделился ссылками на интересные доклады по теме.
Зачем CXL, если есть PCIe?
Многие, кто слышит о CXL впервые или не углублялся в технические детали, могут задать вполне справедливый вопрос: зачем еще одна шина, ведь есть PCI Express (PCIe)? На ум сразу приходят два ключевых минуса PCIe:
низкая производительность,
некогерентный доступ к ресурсам устройств.
Что такое когерентность
Когерентность кешей в многопроцессорной системе с общей памятью — это способность всех процессоров видеть одинаковые значения в одной и той же ячейке памяти, даже когда ее модифицируют.
В качестве одного из вариантов реализации подобной системы используют мониторинг транзакций на шине — snooping. Этот способ позволяет участникам системы (агентам) своевременно узнавать об изменениях закешированных ими данных. Такие шины называют когерентными шинами.
В качестве примера рассмотрим схему ниже: диапазоны физической памяти MMIO и PCIe настраиваются биосом и операционной системой как некешируемые регионы памяти, из-за чего любой доступ процессора по этим адресам превращается в IO-bound задачу.
Подробнее о том, как реализуется когерентность кешей в процессоре, можно почитать на странице в wiki или на сайте Real World Tech.
Суперкомпьютерам не хватает пропускной способности шины PCIe, особенно когда речь идет о сложных научных симуляциях и обучении больших AI-моделей. Почему? Обычно в таких задачах вычисления проходят одновременно на множестве GPU, распределенных в кластере по несколько на каждый хост. Приходится обмениваться промежуточными данными между видеокартами как на локальном хосте, так и в сети. Но современные видеокарты настолько быстрые, что пропускная способность PCIe-шины становится узким местом.
Это ограничение подтолкнуло вендоров к разработке проприетарных интерконнектов для связи видеокарт между собой напрямую. Один графический ускоритель NVIDIA H100 с тензорными ядрами поддерживает до 18 NVLink-соединений с общей пропускной способностью 900 ГБ/с. А это больше чем в семь раз превосходит возможности интерфейса PCIe пятого поколения, который имеет пропускную способность до 128 ГБ/с.
С когерентностью чуть интереснее. Поскольку PCIe является некогерентной шиной, то вычислительные устройства не могут эффективно разделять ресурсы между собой и хостом. Например, устройства не могут кешировать данные на своей стороне, если не владеют ими в монопольном режиме. В результате параллельная обработка одних и тех же данных несколькими ускорителями или ускорителем и центральным процессором становится сложной и медленной.
Другая проблема касается расширителей памяти хоста — такие устройства требуют интеграции с кешем процессора на аппаратном уровне. Иначе производительность решения будет низкой, а у программистов добавится лишняя работа по синхронизации данных в коде и хорошая возможность наделать ошибок.
Так что интерес к развитию шины CXL обоснован — индустрия стремится поддерживать новые типы устройств и находить новые сценарии применения.
Организация шины CXL
Что еще важно сказать про PCIe — она организована как сеть. В отличии от legacy PCI, где, например, есть отдельный пин для прерываний, PCIe коммуницирует только с помощью сообщений. И лишь имитирует эти самые устаревшие пины прерываний.
CXL использует физические и электрические интерфейсы PCIe — те же самые провода, ту же самую сеть. Вот только логические сообщения у нее уже другие. То есть, чтобы поддержать сам протокол, нужно внести изменения только в стейт-машины, прошивки устройств, свитчей и рут-комплексов, а также драйверы.
Например, когда CXL-устройство вставляют в универсальный слот на хосте, сначала взаимодействие происходит по протоколу PCIe 5.0 — чтобы согласовать параметры канала передачи данных и проверить поддержку CXL со стороны процессора. Если всё проходит успешно, дальше используется протокол CXL. Если нет — устройство будет «общаться» с хостом по протоколу PCIe.
Протокол CXL
В CXL три протокола взаимодействия:
CXL.io — отвечает за некогерентный интерфейс устройства. По функциональности и смыслу повторяет протокол PCIe. В основном его используют для обнаружения устройства и управления питанием, доступа к регистрам и передачи ошибок;
CXL.cache — отвечает за доступ к памяти хоста и кеширование ее содержимого у себя, а также принимает snoop-запросы от хоста и возвращает модифицированные данные — для поддержания когерентности;
CXL.memory — обеспечивает транзакционный интерфейс для доступа центрального процессора к памяти устройства.
Совокупность трех протоколов позволяет настроить разделяемую память между хостом и устройством. В этом случае аппаратная синхронизация данных дает минимальные задержки и, поскольку данные кеширует не только центральный процессор, но и ускоритель, производительность может возрастать.
Типы устройств CXL
Выделяют три типа устройств:
Type 1 Devices — используют протоколы CXL.io и CXL.cache. Это акселераторы без собственной оперативной памяти. Например, сопроцессоры или SmartNIC. Такие устройства могут иметь когерентный доступ к оперативной памяти центрального процессора, чтобы реализовывать zero-copy подход для обработки данных.
Type 2 Devices — используют протоколы CXL.io, CXL.cache и CXL.memory. К этому классу относятся акселераторы с собственной оперативной памятью. Например, GPU, ASIC или FPGA. Они могут как сами получать кешируемый доступ к оперативной памяти на хосте, так и предоставлять центральному процессору кешируемый доступ к своей памяти, образуя гетерогенную систему вычислений.
Type 3 Devices — используют протоколы CXL.io и CXL.memory. Это расширители памяти. Такие устройства не имеют своих вычислительных ресурсов, однако могут предоставлять центральному процессору кешируемый доступ к дополнительной оперативной или персистентной памяти.
Таким образом, привычный нам набор PCI-устройств дополняется новыми типами CXL-акселераторов и расширителей памяти.
Сценарии применения CXL в облаке
Чем могут быть полезны CXL-устройства в облачной инфраструктуре? Ниже перечислил основные варианты.
Offloading. Специализированные ускорители, в том числе с собственной оперативной или персистентной памятью на борту. Позволяют переносить на них реализацию облачной инфраструктуры и отдавать под виртуальные машины больше ядер CPU. Возможно даже обеспечить изоляцию для подключения к облаку выделенных bare metal хостов.
Также можно увеличить производительность систем хранения и баз данных, а в некоторых случаях уменьшить количество передаваемых данных по сети или шине за счет вычислений на стороне устройства хранения. Например, такое устройство может анализировать, шифровать, сжимать, вычислять, фильтровать или агрегировать данные на лету.
Memory Expander. Расширение оперативной памяти хоста до десятков или даже сотен терабайт. Особенно актуально для AI-задач и высокопроизводительных вычислений (HPC).
Memory Pooling and Sharing. Подключение нескольких вычислительных узлов к CXL-свитчам с большим количеством присоединенной к ним памяти. В этом случае вместо резервирования большого запаса памяти на каждом хосте локально, можно выделять память из пула по запросу под большие задачи. Это позволит уменьшить стоимость серверов.
Также можно настроить живую миграцию виртуальных машин через полное выдавливание их оперативной памяти в общий пул и передачу вычислений на другой хост. Для этого нужно поддержать хранение холодных страниц памяти виртуальных машин в общем пуле CXL, а для миграции довыдавить еще и горячие страницы. Это поможет избежать лишних нагрузок на сеть.
Альтернативные технологии
Можно ли пойти путем без CXL? В целом — да.
Например, использовать RDMA — в этом случае копирование данных перекладывается с центрального процессора на сетевую карту. Из плюсов: из-за отсутствия когерентности RDMA — широко доступная технология с упрощенной реализацией. Можно организовать сценарии с memory expander и memory pooling. Например, то же вытеснение холодных страниц из локальной памяти на удаленный хост. Из минусов: нужна будет сложная программная реализация, в то время как в CXL это может делаться аппаратно. Также с RDMA будет сложно настроить сценарий с разделяемой памятью.
Еще можно использовать PCIe NTB (non-transparent bridging) — технология позволяет связать несколько PCIe-доменов между собой. Устройства на различных хостах будут взаимодействовать друг с другом, а главное — можно настроить доступ к удаленной памяти. Как и в RDMA, центральный процессор не копирует данные на удаленный хост, этим занимается PCIe Root Complex. Сценарии с memory expander и memory pooling можно реализовать программно. Но, как вы помните, шина PCIe — некогерентная шина, поэтому в сценариях с разделяемой памятью будет так же сложно добиться эффективности, как с RDMA. Также можно настроить RDMA поверх NTB.
Обе технологии позволяют организовать подход disaggregated memory. Однако сделать эффективную гетерогенную систему не получается — при параллельной работе нескольких вычислителей нельзя так просто кешировать данные, как при использовании CXL.
Заключение
Какие выводы по поводу технологии CXL я сделал по итогам саммита?
Во-первых, по сравнению с PCIe пропускная способность новой CXL-шины не улучшилась. Однако появились новые функциональные возможности, которые открывают интересные сценарии применения, в том числе и в облачной инфраструктуре. А в сравнении с альтернативными подходами к организации удаленной памяти, полная аппаратная реализация обещает экстремально низкие задержки. Серверы на базе процессоров AMD EPYC Gen4 уже поддерживают расширение оперативной памяти через CXL-шину, а серверы на базе процессоров Intel Xeon Scalable Gen5 поддерживают все три типа CXL-устройств.
Во-вторых, любопытно, что спецификация CXL уже выпущена аж версии 3.1, но в железе, которое можно купить сейчас, реализованы только версии до 2.0. Вероятно, основные сценарии применения довольно узкоспециализированные, поэтому адаптация технологии идет медленно. Сотни терабайт оперативной памяти — весьма экзотический сетап, а аппаратные ускорители, заточенные под конкретную задачу — дорогая и сложная конструкция, которую могут позволить себе только крупные вендоры. Получается, без возможности массового применения подобное железо развивается медленно. В любом случае мы в команде очень ждем возможности попробовать его в деле.
Вот эти доклады про CXL я отметил как самые интересные — можете почитать или посмотреть в записи:
Increasing AI and HPC Application Performance with CXL Fabrics,
Bringing Unique Customer Value with CXL Accelerator-Based Memory Solutions.
Да и в целом интересный саммит получился для тех, кто любит порассуждать про «космические корабли». Больше всего мне запомнился доклад Breakthrough in Cyber Security Detection Using Computational Storage. Авторы научились определять зловредную активность (anomaly detection) со стороны самого диска без использования ресурсов хоста, чтобы защищать своих заказчиков от вирусов шифровальщиков и вымогателей (ransomeware detection). Рекомендую посмотреть.
А если хотите послушать уже про наши исследовательские проекты (и не только), приходите на конференцию GoCloud Tech 24 октября в Москве или подключайтесь к онлайн-трансляции.
Интересное в блоге: