Векторизация и диспетчеризация ЦП в Clickhouse

ClickHouse примеры курсы обучение, инженерия данных с ClickHouse, работа с ClickHouse , Школа Больших Данных Учебный центр Коммерсант

Как ClickHouse реализует параллельные векторные вычисления над большим объемом данных на любых аппаратных платформах: диспетчеризация ЦП для выполнения SIMD-инструкций в сложных функциях.

Реализация векторных вычислений в ЦП

Как мы уже отмечали здесь, ClickHouse имеет встроенную поддержку векторных вычислений, когда при выполнении одной инструкции процессора производится не одна операция, а одновременно несколько однотипных операций над несколькими порциями данных. Процессоры, которые это поддерживают, называются SIMD (Single Instruction, Multiple Data). SIMD-процессоры обеспечивают параллелизм на уровне данных, реализуя множественный поток данных на одиночный поток команд. Короткие SIMD-инструкции (64 или 128 бит) появились в процессорах общего назначения в 1990-х годах благодаря введению специальных регистров с повышенной разрядностью и команд для работы с ними. Векторные инструкции реализуют те же операции, что и скалярные, но имеют более высокую производительность благодаря обработке большего объема данных. Современные процессоры позволяют обрабатывать данные в векторах с использованием SIMD-инструкций с помощью ручной или автоматической векторизации компилятором.

С точки зрения аналитической обработки больших объемов данных, для чего и была разработана СУБД ClickHouse, SIMD-инструкции позволяют процессору выполнять одну и ту же операцию одновременно на множестве элементов. ClickHouse активно использует SIMD для повышения производительности. Например, при вычислении агрегатных функций, таких как, суммы значений в столбце, вместо последовательного сложения каждого элемента, SIMD-инструкции позволяют складывать несколько чисел одновременно. Имея 256-битный SIMD регистр ЦП, можно сложить восемь 32-битных целых чисел за одну операцию. Аналогично и при фильтрации данных с помощью оператора WHERE, SIMD дает возможность сравнивать несколько значений одновременно. Это значительно ускоряет процесс, особенно если данные хранятся в векторизированной форме.

Кроме того, ClickHouse использует SIMD для быстрого сжатия и декомпрессии данных. Это позволяет хранить больше данных в памяти и быстрее извлекать их при необходимости. Например, алгоритмы сжатия LZ4 или ZSTD могут использовать SIMD-инструкции для параллельной обработки блоков данных. В текстовых столбцах, где необходимо сравнить строки или найти подстроку, SIMD может использоваться для одновременной проверки нескольких символов. Это ускоряет операции поиска подстроки с оператором LIKE или по регулярным выражениям. Для работы с логическими типами данных, к которым применяются побитовые операции AND, OR и XOR, SIMD-инструкции распространяют их сразу на несколько битовых строк.

Векторная оптимизация с выполнением SIMD-инструкций встроена в некоторые агрегатные функции ClickHouse, такие как sum или count. Это достигается за счет использования библиотек, таких как Intel SIMD или аналогичных для ARM-архитектур, которые непосредственно интегрируются в движок ClickHouse, обеспечивая высокую производительность на уровне аппаратуры. Как именно это делается с помощью диспетчеризации ЦП, посмотрим далее.

Диспетчеризация ЦП и как это влияет на ClickHouse

Современные компиляторы могут векторизовать даже сложные циклы с помощью инструкций SIMD. Также разработчик может сам векторизовать свой код вручную или разработать алгоритмы, ориентированные на SIMD. Например, можно изменить код так, чтобы он был векторизуем, перепроектировав представление данных или векторизовать цикл вручную с помощью специальных встроенных объектов компилятора (intrinsic). Этот вариант считается менее предпочтительным из-за дополнительного обслуживания. Но эти манипуляции, как и использование современных наборов инструкций снижают переносимость программы или библиотеки. Чтобы устранить такую зависимость от платформы, используется техника диспетчеризации ЦП (CPU dispatch), когда есть несколько скомпилированных версий кода для различных функций CPU, и во время выполнения программа определяет, какие функции CPU есть, и использует самую производительную версию. Эта техника позволяет программам использовать специфические аппаратные возможности процессоров, т.е. специализированные регистры. Программа может включать несколько реализаций одних и тех же функций, оптимизированных под разные наборы инструкций, такие как SSE, AVX и пр.

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

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

Таким образом, встроенная диспетчеризация ЦП в ClickHouse не только повышает производительность сложных вычислений с большим объемом данных, но и снижает зависимость SIMD-инструкций от разных платформ. Можно найти места для повышения производительности, используя тесты производительности и компиляцию кода с различными конфигурациями. Например, если процессор поддерживает AVX2 или AVX-512, фреймворк будет использовать эти расширенные инструкции для повышения эффективности обработки данных. Этот подход позволяет ClickHouse работать быстрее на современных процессорах, максимально используя их возможности, и сохранять совместимость с более старыми архитектурами, адаптируясь под их особенности. Такой механизм автоматической адаптации к ЦП помогает обеспечить высокую производительность и оптимальное использование аппаратных ресурсов, что особенно важно при аналитической обработке больших объемов данных с помощью ClickHouse.

Научиться работать с ClickHouse вам помогут специализированные курсы в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://clickhouse.com/blog/cpu-dispatch-in-clickhouse
  2. https://www.elecard.com/ru/page/article_vector_instructions_part1
Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.
Поиск по сайту