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

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

На состоявшейся в этом месяце Международной конференции по параллельным архитектурам и техникам компиляции, сотрудники лаборатории информатики и искусственного интеллекта (CSAIL) Массачусетского технологического института (MIT) представили новый язык программирования, Milk, который позволяет создавать приложения, эффективно управляющие памятью при работе с рассеянными данными в крупных массивах.

В испытаниях на некоторых обычных алгоритмах, программы на Milk работали в четыре раза быстрее, написанных на других языках. Однако исследователи надеются в дальнейшем добиться ещё более значительного выигрыша в производительности.

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

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

Если углубляться в детали, все выглядит намного сложнее. Так, современные чипы используют не один кэш, а целую структуру уровней, в которой с ростом объёма хранения снижается скорость доступа. Компилятор Milk не только манипулирует списком адресов, но и регулярно перетасовывает содержимое разных уровней кэша, прогнозирует вероятность повторных запросов и выполняет прочую «хореографию» с данными, ведущую к дополнительному росту быстродействия.

«Многие важные приложения сегодня интенсивно обращаются к данным, но, к сожалению, растущий зазор в производительности между памятью и процессором означает, что они не могут полностью использовать возможности современного оборудования, — заявил Матей Захария (Matei Zaharia), доцент информатики из Стэнфорда. — Milk помогает преодолеть это отставание, оптимизируя доступ к памяти в основных концепциях программирования».