От советских компиляторов до грязных трюков: что поведают на C++ Russia 2024
Завсегдатаи C++ Russia уже хорошо знают некоторых спикеров и ждут их новых докладов. Например, Антона Полухина @antoshkka: в 2020-м все смотрели его «Грязные трюки из такси», а недавно — «C++ трюки из userver». Из необычного — серия докладов Петра Советова об автоматизации программирования в СССР: уже были выступления о теоретических результатах и о трансляторах.
Через месяц начнётся C++ Russia 2024. Там будут и Антон с новыми трюками (в этот раз грязными!), и Пётр с заключительной частью исторической серии. А ещё множество другого — от работы с GPU до новинок грядущего C++26.
И теперь, когда программа почти готова (возможны небольшие дополнения), показываем её Хабру: приводим короткие описания всех докладов, разбитые по тематическим блокам. А если интересует какая-то другая информация о конференции или билеты — всё это на её сайте.
Содержание
Практичный С++
Производительность
Возможности новых стандартов
GPU
Геймдев
Компиляторы
Инструменты
Снова об основах
Concurrency
CPP4FUN
Другое
Заключение
Практичный C++
Грязные C++ трюки из userver и Boost
Яндекс Go
Антон расскажет и покажет, как создать некоторые отлично работающие C++ решения «на грани фола»:
получение stack trace из любого исключения без изменения кода сторонних библиотек;
подмена части механизма исключений на лету, чтобы улучшить их производительность;
код с выполнением функции по адресу 0×42, чтобы делать интересные штуки на compile-time;
получение имён полей структуры на этапе компиляции без макросов и кодогенерации.
Пожалуйста, не повторяйте это в проде, не проконсультировавшись с коллегами!
Дерево смещений: работаем с динамически изменяемыми сегментированными массивами
VK / ВКонтакте
Представим большой список, например, историю сообщений чата. Есть окно просмотра (viewport), куда попадает малая часть списка, и нужно рисовать только её, причём 30 раз в секунду (то есть быстро находить видимые элементы). При этом сообщения могут быть отредактированы (что меняет их размер) или удалены.
Роман расскажет о подходе к задаче. Опишет несколько «наивных» решений с использованием стандартных контейнеров. Объяснит, почему они неэффективны. Представит эффективное решение с помощью так называемого дерева смещений, благодаря чему реализация станет универсальной и настраиваемой.
Миллион падающих тестов, или Как мы запустили известный опенсорс-продукт на RISC-V и исправили его
YADRO
YADRO
Спикеры развивают программную экосистему для RISC-V, и когда встала задача предоставить математический бэкенд для ИИ, не только выбрали лучший вариант, но и дополнили его. Валерия и Андрей расскажут:
что такое BLAS и почему API из 80-х сейчас актуален;
какие есть альтернативы OpenBLAS и почему выбрали его;
как развивается HPC на RISC-V;
как тестируются сложные математические функции на примере LAPACK.
constexpr-аллокатор для контейнеров стандартной библиотеки
VK
Константные вычисления выделяют С++ среди других языков. В С++ 20 появились аллокации памяти в constexpr-выражениях, и стало возможным использовать std: vector и std: string в константных выражениях. Однако использовать их можно только внутри constexpr, из constexpr-функции нельзя вернуть std: string или std: vector.
В докладе рассмотрим, как, используя только лишь возможности С++23, написать аллокатор, с помощью которого можно реализовать top-level constexpr std: string, std: vector и остальные контейнеры стандартной библиотеки.
Полезные трюки С++ на примере организации пайплайна
Яндекс Доставка
В рамках микросервисной архитектуры достаточно легко делать «реактивные» сервисы: к вам приходит событие или вызов HTTP-метода, и в ответ на это происходит некоторое действие. Однако бывают более сложные сценарии, когда надо собрать некоторое количество информации или событий прежде, чем что-то делать. В таком случае нужен «пайплайн» — механизм организации сложных правил обработки.
Недавно команде Павла пришлось организовать такой механизм с использованием некоторых интересных С++ трюков. В докладе он расскажет про ряд мелких трюков с использованием синтаксиса С++20, а также про их применение для реальной задачи: организации пайплайна.
JSON в C++: трюки, хаки и Unicode
— Спроектируем C++ тип для работы с JSON-значениями, пройдемся по дизайну типов, вспомним и внимательно посмотрим на стандартные контейнеры, std: variant, и попробуем сделать интерфейс, который легко использовать правильно и сложно использовать неправильно.
— Углубимся в спецификацию JSON и реализуем экранирование строк (escaping), посмотрим на подводные камни на пересечении JSON и Unicode.
— Реализуем достаточно гибкую сериализацию (serialization/stringification).
— На закуску добавим поддержку C++ аллокаторов.
Производительность
Использование подходов SoA/AoS для работы с многоуровневыми структурами данных
Мультимодальная система хранения Otterbrix использует многомерные «документы» в качестве базового формата хранения как в памяти, так и на диске. Но «документы» в данном случае не означают JSON, это — как специализированные структуры, используемые для хранения, так и алгоритмы обработки таких данных. Эти алгоритмы разумно варьируют подходы Structure-of-Array (SoA) / Array-of-Structure (AoS).
Такие многомерные «документы» должны быть гибкими и быстрыми, уметь работать в памяти и с диском, а еще (хорошо бы) использовать механизмы параллелизма GPU. В дальнейшем такой «документ» можно конвертировать в специализированные строчные и колоночные форматы и делать многое другое, о чем вам расскажут в докладе.
Аптечка производительности для C/C++ серверов
VK / Tarantool
Владислав представит серию кратких и простых низкоуровневых рецептов того, как достичь производительности за счет оптимизации кода. Несмотря на то, что для этого обычно требуются совсем точечные изменения, они могут ускорить код в N раз. Работа будет вестись с проблемами трёх категорий: конкуренция потоков, чрезмерная нагрузка на кучу (heap) и сетевой ввод-вывод.
Поиск самой быстрой MPMC-очереди
Yandex Infrastructure
В основе YDB лежит акторная система, написанная на С++. А в основе акторной системы лежит очередь активаций, в которую разные потоки ставят идентификаторы акторов, и одновременно множество потоков забирает идентификаторы и выполняет активацию соответствующих акторов. Алексей расскажет, как в Яндексе оптимизировали эту очередь, попробовав mutex, различные lock-free и wait-free, честные варианты и не очень, и что в итоге получилось. С флейм-графами и результатами бенчмарков.
Нельзя так просто взять и автовекторизовать, или Ускоряем цифровую обработку сигналов с набором стандартных инструкций AVX-512
YADRO
На примерах оптимизации алгоритмов из жизни Василий продемонстрирует приемы ускорения DSP-специфичного кода на SIMD с набором инструкций класса AVX-512.
Имеется большой объем вычислений, которые надо выполнить в жестком реальном времени. При этом далеко не во всех случаях автовекторизация хорошо справляется с максимальным задействованием ресурсов процессора. Следовательно, приходится векторизовывать вручную. Как распознать места, где компилятор не справляется, и как ему помочь?
Динамические библиотеки и способы ускорения их работы
Независимый эксперт
В современных операционных системах активно используются динамические библиотеки. Несмотря на ряд достоинств, они не свободны от недостатков. К ним прежде всего относятся накладные расходы при загрузке и в процессе работы программы.
В докладе Юрий расскажет о принципах работы динамических библиотек, особенностях их реализации в различных операционных системах и способах ускорения их работы.
Оптимизация B-дерева для численных in-memory индексов
VK / ВКонтакте
Доклад описывает путь развития B-дерева, которое хранит численные типы для in-memory поисковых индексов рекламного движка ВКонтакте. Будет полезно как начинающим разработчикам, так и опытным программистам, потому что список оптимизаций состоит из базовых улучшений (SOO, key-stealing) и интересного алгоритма поиска в дереве, который основан на векторных инструкциях.
Возможности новых стандартов
Обзор C++26
По следам встречи комитета в Токио Александр расскажет, что нас ждет в С++26.
Опасность устарела, неопределенность недопустима: исследуем изменения в undefined behavior в С++20/23/26
Kaspersky
В современных стандартах С++ стало меньше UB. Разберем на конкретных кейсах вроде таких:
Начиная с С++20 отрицательные целые числа обязательно должны быть представлены в дополнительном коде. Это сокращает количество UB в битовых операциях и не только.
Введение std: ssize, возвращающего знаковый размер контейнеров, уменьшает количество ошибок и UB в циклах.
Расширение времени жизни временных объектов в циклах for, появившееся в С++23, решает неочевидные проблемы.
**О денотации: разрешение имен и его пересмотр в C++23 **
Syntacore
Этот доклад — попытка сделать темную и мрачную область разрешения имен в C++ простой и ясной для практикующего программиста.
Контракты для С++
Попытка добавить контракты в стандарт C++20 потерпела неудачу, однако в C++26, вероятно, войдёт новая версия, рассмотрим её. Обсудим разновидности контрактов (preconditions, postconditions, assertions), возможные режимы проверки, обработку нарушений и многое другое. Рассмотрим, чем текущий дизайн превосходит существующие реализации на макросах и как помогает повысить безопасность и корректность кодовой базы.
GPU
Применение GPU для решения задачи N тел на примере моделирования Большого взрыва и движения вещества в галактиках
Yandex Infrastructure
Доклад о разработке универсальной кроссплатформенной программы для решения задачи N тел на GPU.
Программа реализована с использованием API Vulkan и языка программирования GLSL, что обеспечивает высокую гибкость и масштабируемость. Основное внимание уделено адаптации классических алгоритмов PM (Particle-Mesh) и P3M (Particle-Particle-Particle-Mesh) для оптимизированной работы на GPU. Эти модификации позволяют эффективно использовать возможности параллельных вычислений, характерных для современных графических процессоров, в моделировании сложных астрофизических процессов, таких как Большой взрыв и динамика вещества в галактиках.
SYCL: Integrated Compiler Runtime for Accelerated Deep Learning
Intel
Стандартом для глубокого обучения (deep learning) во всём мире стали LLM и генеративные модели. Однако в этом мире зачастую фреймворки оптимизированы для конкретных физических устройств, и высокую производительность показывают только на них. Чтобы сделать глубокое обучение доступнее и универсальнее, требуются бэкенды компиляторов, независимые от конкретного устройства. Доклад разработчика из Intel посвящен тому, как создавать их с помощью SYCL и при этом использовать платформо-зависимые оптимизации.
Современные upscale-алгоритмы DLSS, MetalFX, FSR, XeSS
Elverils
Поговорим об upscale-алгоритмах, зачем они нужны, как работают. Какие есть преимущества и недостатки. Обсудим, как встроить upscale-алгоритм в уже готовый проект. Евгений поделится своим опытом и расскажет о подводных камнях и частых проблемах.
Нецелевое использование ONNX в качестве математической библиотеки
Postgres Professional
ONNX — универсальный формат представления моделей нейросетей, совместимый со всеми основными ML-фреймворками. Модели в этом формате можно запускать на разных устройствах, включа специальные нейросетевые ускорители (NPU).
Можно ли выйти за пределы нейросетей и запускать на NPU изначально не имеющие к ним отношения алгоритмы? А переиспользовать те же решения на GPU? Да, и мы узнаем, как это сделать, что может ONNX и чего не может, в чем сильные и слабые стороны такого подхода.
GameDev
Практика применения C++ в играх и игровых движках
Игры вечно находитяся на переднем краю как современного железа, так и программных возможностей. Как же обстоят дела с C++ в этой области?
На примере трех сравнительно легких для восприятия сюжетов посмотрим, как так складывается, что стиль имеет тенденцию к C99 с классами. Сюжеты: взаимодействие с другими языками (interop w/scripts), многоплатформенность (compiler zoo, determinism, float) и многопоточность (pthread into OOP vs DOD, ECS, etc.)
Графический API Apple-устройств — теперь и на C++
Elverils
Исторически устройства Apple использовали OpenGL для работы с трехмерной графикой. Кратко пройдем по истории трехмерной графики в Apple и углубимся в современный API — Metal. Какие задачи он решает? Чем отличается от других? Насколько легко применим? И главное: как же программировать для Metal?
Neat Gamedev Tricks and Beyond
Lesta Games
Lesta Games
В геймдеве есть новые веяния, и спикеры поделятся наиболее интересными на их взгляд приемами решения классических задач — «новыми neat-трюками».
В каких задачах можно использовать GPU вместо CPU и при чем тут плюсы? Почему то, чему нас учили, — O (n) — на практике бывает быстрее, чем O (log n)? Что находится в сердце игрового движка? Почему Immediate UI так популярен в геймдеве, и как он ломает мозг непосвященным?
В докладе ответят на эти и другие вопросы, чтобы вдохновить вас на распространение этих подходов вне геймдева.
Компиляторы
Агностическая скриптовая система для игрового движка Nau Engine
Стрим Театр
Доклад о проблеме одновременной интеграции нескольких скриптовых языков в игровой движок. Как не породить ад из биндингов нескольких языков в нативный код и при этом обеспечить присущую скриптовым языкам итеративность и скорость разработки во время создания игр, а также высокую производительность скриптов при AOT-компиляции в финальной сборке игры.
Коротко о Scalar Evolution: как LLVM справляется с проверками диапазонов
Сбер
Как компилятор на основе LLVM может сделать проверки диапазонов в таких языках, как Java, почти бесплатными, используя движок Scalar Evolution (SCEV)?
Макс расскажет, как SCEV устроен изнутри и как оптимизации, борющиеся с проверками диапазонов, извлекают из него пользу. Подробно разберем несколько оптимизаций, благодаря которым можно не делать лишних проверок и за счет этого серьезно улучшить производительность кода на Java и подобных ей языкам.
Автоматизация программирования в СССР: заключительная часть
РТУ МИРЭА
Заключительная часть цикла докладов по автоматизации программирования в СССР (предыдущие доклады: первый, второй).
Речь пойдет о технологиях, которые и сегодня являются передовыми в области построения компиляторов. Это смешанные вычисления, суперкомпиляция и синтез программ. Акцент в докладе, как и ранее, не на истории вопроса, а на конкретных методах и алгоритмах.
Инструменты
Pets, cattle and automatic operations with code
Доклад для тех, кто взаимодействует с большими кодовыми базами. Поговорим про инструменты от Clang, которые помогают автоматизировать малоинтеллектуальное перекладывание кода и прочую рутинную работу с кодовой базой.
Немного обсудим теорию, посмотрим, как использовать инструменты на примере нескольких реальных задач в области авторефакторинга, генерации конфигов по коду и семантического поиска по коду.
LeakSanitizer и менеджмент памяти
Рассмотрим, как устроен LeakSanitizer. Особое внимание уделим его менеджеру памяти, а также менеджеру памяти ASan. Попробуем через публичный API ASan и LSan увидеть и понять, что происходит внутри менеджера памяти.
Узнаем, как LSan использовать без ASan и почему он, в отличие от ASan, не работает под отладчиком. Конечно же, рассмотрим набор полезных функций из публичного API санитайзеров.
Как не стать драконом
PVS-Studio
PVS-Studio
Все слышали фразу «Убийца дракона сам становится драконом». Но что, если именно этого вы и добиваетесь? В нашем случае дракон — никакой не дракон, а компилятор C++.
Доклад о том, как в PVS-Studio решили написать свой фронтенд. При этом стремясь, чтобы он не выродился в уродливого монстра. Рассмотрим немного теории и узнаем, как рождался парсер с семантической моделью.
Будет полезно тем, кто всегда хотел узнать, что под капотом у компилятора и как он умудряется разбирать такой сложный язык, как C++.
Как работает профилирование
МЦСТ
Профилировщики — важная часть тулинга, которая помогает программистам или компиляторам делать код быстрее.
Известны два подхода к профилированию: инструментирование и сэмплирование. Кратко рассмотрим инструментирование на примере PGO, а на примере perf и иных подобных профилировщиков — сэмплирование. Также обсудим аппаратную поддержку профилирования в некоторых процессорах.
Снова об основах
Back Deep to Basics: Наследование и виртуальность в C++ (Часть 2)
Kaspersky
Наследование, виртуальные функции, v-таблицы, виртуальное наследование — вещи, до боли знакомые каждому C++ разработчику. Но так ли мы хорошо знаем эти механизмы?
Практика собеседований показывает, что как только дело доходит до деталей, возникает много нюансов, на которые не всегда находится ответ. Эти вещи напрямую влияют на производительность, объем бинарных файлов, а иногда даже на безопасность кода. Так давайте вернемся к началам и разберемся в деталях этой машинерии. Дополним то, что мы узнали в Части 1.
Корутины для начинающих
Яндекс Лавка
Корутины, представленные в С++, дают очень много точек кастомизации. И для того, чтобы начать работать с корутинами, нужно обдумать и реализовать все эти точки кастомизации.
Обсудим, какие есть достаточные для работы корутин точки кастомизации. В заключение рассмотрим несколько библиотек, с помощью которых возможно начать работать с корутинами без погружения в реализацию точек кастомизации.
Concurrency
Как впихнуть невпихуемое, или Давайте параллелить дружно!
Huawei
Дефицит чипов? Дорогая энергия? Или просто любите использовать железо на 100% и даже больше? Вам покажут на известных бенчмарках, сколько вы теряете. Как это исправить? Можем увеличить скорость обработки задачи с параллельным циклами, использовав концепцию composable parallelism и всего лишь эффективно загрузив систему задачами.
Не существует идеальной технологии, но здесь расскажут, что уже доступно и какие алгоритмы динамического параллелизма создаются сейчас — в надежде, что они подойдут и самым требовательным экспертам.
Taskflow: A General-purpose Task-parallel Programming System
University of Wisconsin–Madison
Параллелизм позволяет добиться более впечатляющей производительности. Однако программировать так, чтобы её получить, бывает непросто, и возникает много нюансов. Многим знаком проект Taskflow, призванный улучшить ситуацию и помочь быстро создавать параллельные решения на современном C++. Если вам интересно узнать об этом больше, не пропустите этот доклад.
CPP4FUN
Добавляем большую языковую модель (LLM) в приложение на С++ с помощью llama.cpp на реальном примере
YADRO
Кирилл покажет, как использовать инструменты для обработки текста на основе LLM (large language model) на простых компьютерах без подключения к онлайн-API — все будет работать локально. Более того, он покажет, как это сделать на С++, почти не используя другие языки.
Расскажет о наборе утилит и библиотек llama.cpp, и их интеграции в свое приложение для использования современных LLM-моделей. О квантовании и как оно помогает уместить LLM в оперативную память ПК. Как решить проблемы интеграции llama.cpp в приложение. И не только
В итоге научимся обобщать и сравнивать сообщения из Telegram-каналов, чтобы формировать новостную картину.
Другое
Нанять за неделю: как мы перевернули подход в подборе разработчиков на С++, и почему это выгодно всем
Kaspersky
Kaspersky
В докладе расскажут, как в Kaspersky перевернули систему подбора разработчиков и собеседований с ними. Как этот процесс выглядит изнутри для рекрутеров и нанимающих команд и снаружи — для самого кандидатa. Какую пользу он приносит всем сторонам.
Не такие уж стандартные контейнеры, или Улучшенные версии STL-контейнеров из библиотеки Boost
YADRO
В библиотеке Boost давно есть альтернативные версии контейнеров, которые выигрывают у стандартных из STL по многим показателям. Однако об этих версиях почти никто не знает, о них почти нет лекций, статей и докладов. Пора положить этому конец и разобраться в том, как еще могут быть устроены контейнеры.
Обсудим внутреннее устройство «не таких уж стандартных» контейнеров: stable_vector, devector, bimap, circular_buffer, а также интрузивных версий list, map, unordered_map и их разновидностей.
Perforator: Yandex-wide Profiling
Yandex
Perforator — распределенный профилировщик, позволяющий постоянно собирать профили использования ресурсов со всего флота. Профилировать приложения достаточно сложно, а профилировать правильно — еще сложнее. Обсудим, как обойти существующие ограничения и научиться анализировать производительность нативных программ под Linux «наживую», под боевой нагрузкой, без модификации исходного кода или пересборки.
Заключение
Доклады — это хорошо, но это не всё. Поучаствовать в конференции можно в двух вариантах:
Полностью онлайн: все три дня подключаться удалённо
С офлайном: 24 мая поучаствовать удалённо (этот день полностью онлайновый), а вот 2–3 мая прийти на московскую площадку лично.
Мы стараемся, чтобы даже при удалённом участии конференция не ощущалась как «просто смотреть ютуб». После каждого доклада спикеры как следует отвечают на вопросы — их можно задавать хоть текстом, хоть по видеосвязи.
Но, конечно, максимум общения происходит на площадке. Там участники и разговаривают друг с другом, и участвуют в активностях на стендах компаний, и подходят к спикерам.
В любом случае, будем ждать вас в том формате, в каком удобно вам — хоть в Москве, хоть в интернете. А напоследок напоминаем главную ссылку на сайт конференции, там и информация, и билеты.