От советских компиляторов до грязных трюков: что поведают на C++ Russia 2024

pxn3hjtfnc7o4edjidfuj7bjyam.jpeg

Завсегдатаи C++ Russia уже хорошо знают некоторых спикеров и ждут их новых докладов. Например, Антона Полухина @antoshkka: в 2020-м все смотрели его «Грязные трюки из такси», а недавно — «C++ трюки из userver». Из необычного — серия докладов Петра Советова об автоматизации программирования в СССР: уже были выступления о теоретических результатах и о трансляторах.

Через месяц начнётся C++ Russia 2024. Там будут и Антон с новыми трюками (в этот раз грязными!), и Пётр с заключительной частью исторической серии. А ещё множество другого — от работы с GPU до новинок грядущего C++26.

И теперь, когда программа почти готова (возможны небольшие дополнения), показываем её Хабру: приводим короткие описания всех докладов, разбитые по тематическим блокам. А если интересует какая-то другая информация о конференции или билеты — всё это на её сайте.

Содержание

  • Практичный С++

  • Производительность

  • Возможности новых стандартов

  • GPU

  • Геймдев

  • Компиляторы

  • Инструменты

  • Снова об основах

  • Concurrency

  • CPP4FUN

  • Другое

  • Заключение

Практичный C++

Грязные C++ трюки из userver и Boost

p_2sb-lxwxuon_vgibh8cqurzpy.jpegАнтон Полухин

Яндекс Go

Антон расскажет и покажет, как создать некоторые отлично работающие C++ решения «на грани фола»:

  • получение stack trace из любого исключения без изменения кода сторонних библиотек;

  • подмена части механизма исключений на лету, чтобы улучшить их производительность;

  • код с выполнением функции по адресу 0×42, чтобы делать интересные штуки на compile-time;

  • получение имён полей структуры на этапе компиляции без макросов и кодогенерации.

Пожалуйста, не повторяйте это в проде, не проконсультировавшись с коллегами!

Дерево смещений: работаем с динамически изменяемыми сегментированными массивами

lxbnzczqolde7q8djkhqqjlvl0q.pngРоман Панов

VK / ВКонтакте

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

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

Миллион падающих тестов, или Как мы запустили известный опенсорс-продукт на RISC-V и исправили его

isl9hizjpozho49vxfo2vjofdfo.jpegВалерия Пузикова

YADRO

hfccf4hnpi8utlim1_cm8w9cxu0.pngАндрей Соколов

YADRO

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

  • что такое BLAS и почему API из 80-х сейчас актуален;

  • какие есть альтернативы OpenBLAS и почему выбрали его;

  • как развивается HPC на RISC-V;

  • как тестируются сложные математические функции на примере LAPACK.

constexpr-аллокатор для контейнеров стандартной библиотеки

wgm7ccianzkm9_qg7wbf_gha9ii.pngСергей Добычин

VK

Константные вычисления выделяют С++ среди других языков. В С++ 20 появились аллокации памяти в constexpr-выражениях, и стало возможным использовать std: vector и std: string в константных выражениях. Однако использовать их можно только внутри constexpr, из constexpr-функции нельзя вернуть std: string или std: vector.

В докладе рассмотрим, как, используя только лишь возможности С++23, написать аллокатор, с помощью которого можно реализовать top-level constexpr std: string, std: vector и остальные контейнеры стандартной библиотеки.

Полезные трюки С++ на примере организации пайплайна

-ardexe43qr-aisqmpjspvv46xq.pngПавел Сухов

Яндекс Доставка

В рамках микросервисной архитектуры достаточно легко делать «реактивные» сервисы: к вам приходит событие или вызов HTTP-метода, и в ответ на это происходит некоторое действие. Однако бывают более сложные сценарии, когда надо собрать некоторое количество информации или событий прежде, чем что-то делать. В таком случае нужен «пайплайн» — механизм организации сложных правил обработки.

Недавно команде Павла пришлось организовать такой механизм с использованием некоторых интересных С++ трюков. В докладе он расскажет про ряд мелких трюков с использованием синтаксиса С++20, а также про их применение для реальной задачи: организации пайплайна.

JSON в C++: трюки, хаки и Unicode

04v-9neg2uzd4tzqgdymew5ptow.jpegПавел Новиков

— Спроектируем C++ тип для работы с JSON-значениями, пройдемся по дизайну типов, вспомним и внимательно посмотрим на стандартные контейнеры, std: variant, и попробуем сделать интерфейс, который легко использовать правильно и сложно использовать неправильно.
— Углубимся в спецификацию JSON и реализуем экранирование строк (escaping), посмотрим на подводные камни на пересечении JSON и Unicode.
— Реализуем достаточно гибкую сериализацию (serialization/stringification).
— На закуску добавим поддержку C++ аллокаторов.

Производительность

Использование подходов SoA/AoS для работы с многоуровневыми структурами данных

ntocdip7mhejkieaifgzefgwanc.jpegАлександр Боргардт

Мультимодальная система хранения Otterbrix использует многомерные «документы» в качестве базового формата хранения как в памяти, так и на диске. Но «документы» в данном случае не означают JSON, это — как специализированные структуры, используемые для хранения, так и алгоритмы обработки таких данных. Эти алгоритмы разумно варьируют подходы Structure-of-Array (SoA) / Array-of-Structure (AoS).

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

Аптечка производительности для C/C++ серверов

br9sqjof7lqupha1063lnf4jlje.jpegВладислав Шпилевой

VK / Tarantool

Владислав представит серию кратких и простых низкоуровневых рецептов того, как достичь производительности за счет оптимизации кода. Несмотря на то, что для этого обычно требуются совсем точечные изменения, они могут ускорить код в N раз. Работа будет вестись с проблемами трёх категорий: конкуренция потоков, чрезмерная нагрузка на кучу (heap) и сетевой ввод-вывод.

Поиск самой быстрой MPMC-очереди

qor3klwvdh5wdrobyxfe07auq7w.jpegАлексей Станкевичус

Yandex Infrastructure

В основе YDB лежит акторная система, написанная на С++. А в основе акторной системы лежит очередь активаций, в которую разные потоки ставят идентификаторы акторов, и одновременно множество потоков забирает идентификаторы и выполняет активацию соответствующих акторов. Алексей расскажет, как в Яндексе оптимизировали эту очередь, попробовав mutex, различные lock-free и wait-free, честные варианты и не очень, и что в итоге получилось. С флейм-графами и результатами бенчмарков.

Нельзя так просто взять и автовекторизовать, или Ускоряем цифровую обработку сигналов с набором стандартных инструкций AVX-512

mvoqpoj9xzl4uf4f-8_sjv7_ak0.jpegВасилий Рамаданов

YADRO

На примерах оптимизации алгоритмов из жизни Василий продемонстрирует приемы ускорения DSP-специфичного кода на SIMD с набором инструкций класса AVX-512.

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

Динамические библиотеки и способы ускорения их работы

tlunk63lbszwa4mfkqsibjcmxou.jpegЮрий Грибов

Независимый эксперт

В современных операционных системах активно используются динамические библиотеки. Несмотря на ряд достоинств, они не свободны от недостатков. К ним прежде всего относятся накладные расходы при загрузке и в процессе работы программы.

В докладе Юрий расскажет о принципах работы динамических библиотек, особенностях их реализации в различных операционных системах и способах ускорения их работы.

Оптимизация B-дерева для численных in-memory индексов

arqpxbap5tfzktac3kt4llslmxw.pngОлег Утусиков

VK / ВКонтакте

Доклад описывает путь развития B-дерева, которое хранит численные типы для in-memory поисковых индексов рекламного движка ВКонтакте. Будет полезно как начинающим разработчикам, так и опытным программистам, потому что список оптимизаций состоит из базовых улучшений (SOO, key-stealing) и интересного алгоритма поиска в дереве, который основан на векторных инструкциях.

Возможности новых стандартов

Обзор C++26

bn-_vu_iqzxql6japwrr3sutfjg.jpegАлександр Фокин

По следам встречи комитета в Токио Александр расскажет, что нас ждет в С++26.

Опасность устарела, неопределенность недопустима: исследуем изменения в undefined behavior в С++20/23/26

bfxq_fiyragczg4q6uvxaibub6k.pngСергей Талантов

Kaspersky

В современных стандартах С++ стало меньше UB. Разберем на конкретных кейсах вроде таких:

  • Начиная с С++20 отрицательные целые числа обязательно должны быть представлены в дополнительном коде. Это сокращает количество UB в битовых операциях и не только.

  • Введение std: ssize, возвращающего знаковый размер контейнеров, уменьшает количество ошибок и UB в циклах.

  • Расширение времени жизни временных объектов в циклах for, появившееся в С++23, решает неочевидные проблемы.

**О денотации: разрешение имен и его пересмотр в C++23 **

xhbxm7vykpscpasv48gpuo0hjwk.pngКонстантин Владимиров

Syntacore

Этот доклад — попытка сделать темную и мрачную область разрешения имен в C++ простой и ясной для практикующего программиста.

Контракты для С++

8eabr-ck2bj4_udt-xevcfsxrpc.jpegТимур Думлер

Попытка добавить контракты в стандарт C++20 потерпела неудачу, однако в C++26, вероятно, войдёт новая версия, рассмотрим её. Обсудим разновидности контрактов (preconditions, postconditions, assertions), возможные режимы проверки, обработку нарушений и многое другое. Рассмотрим, чем текущий дизайн превосходит существующие реализации на макросах и как помогает повысить безопасность и корректность кодовой базы.

GPU

Применение GPU для решения задачи N тел на примере моделирования Большого взрыва и движения вещества в галактиках

gff9bxiucect-ig4py3mhduq9zi.pngАлексей Озерицкий

Yandex Infrastructure

Доклад о разработке универсальной кроссплатформенной программы для решения задачи N тел на GPU.

Программа реализована с использованием API Vulkan и языка программирования GLSL, что обеспечивает высокую гибкость и масштабируемость. Основное внимание уделено адаптации классических алгоритмов PM (Particle-Mesh) и P3M (Particle-Particle-Particle-Mesh) для оптимизированной работы на GPU. Эти модификации позволяют эффективно использовать возможности параллельных вычислений, характерных для современных графических процессоров, в моделировании сложных астрофизических процессов, таких как Большой взрыв и динамика вещества в галактиках.

SYCL: Integrated Compiler Runtime for Accelerated Deep Learning

mkkyac3ymgnj8dhvjv56gejszzk.pngAbhilash Majumder

Intel

Стандартом для глубокого обучения (deep learning) во всём мире стали LLM и генеративные модели. Однако в этом мире зачастую фреймворки оптимизированы для конкретных физических устройств, и высокую производительность показывают только на них. Чтобы сделать глубокое обучение доступнее и универсальнее, требуются бэкенды компиляторов, независимые от конкретного устройства. Доклад разработчика из Intel посвящен тому, как создавать их с помощью SYCL и при этом использовать платформо-зависимые оптимизации.

Современные upscale-алгоритмы DLSS, MetalFX, FSR, XeSS

mx-by7qi4in63gej17g2lf-hkdm.pngЕвгений Григорчук

Elverils

Поговорим об upscale-алгоритмах, зачем они нужны, как работают. Какие есть преимущества и недостатки. Обсудим, как встроить upscale-алгоритм в уже готовый проект. Евгений поделится своим опытом и расскажет о подводных камнях и частых проблемах.

Нецелевое использование ONNX в качестве математической библиотеки

nbuogponm-ti-5cvtvm7vi966y8.jpegТимур Магомедов

Postgres Professional

ONNX — универсальный формат представления моделей нейросетей, совместимый со всеми основными ML-фреймворками. Модели в этом формате можно запускать на разных устройствах, включа специальные нейросетевые ускорители (NPU).

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

GameDev

Практика применения C++ в играх и игровых движках

_obri_bphyuucsvztqciivpfbic.pngАнтон Яковлев

Игры вечно находитяся на переднем краю как современного железа, так и программных возможностей. Как же обстоят дела с C++ в этой области?

На примере трех сравнительно легких для восприятия сюжетов посмотрим, как так складывается, что стиль имеет тенденцию к C99 с классами. Сюжеты: взаимодействие с другими языками (interop w/scripts), многоплатформенность (compiler zoo, determinism, float) и многопоточность (pthread into OOP vs DOD, ECS, etc.)

Графический API Apple-устройств — теперь и на C++

snxnzcoxcrqjgocnuigvybumxju.pngПлатон Фомичев

Elverils

Исторически устройства Apple использовали OpenGL для работы с трехмерной графикой. Кратко пройдем по истории трехмерной графики в Apple и углубимся в современный API — Metal. Какие задачи он решает? Чем отличается от других? Насколько легко применим? И главное: как же программировать для Metal?

Neat Gamedev Tricks and Beyond

sr-pjadriu9niyys0nmnqpjbzsg.pngФилипп Белозёров

Lesta Games

tsmrsb8w9-ysb7yqsgkvjpjxmuk.pngВладислав Гордиенко

Lesta Games

В геймдеве есть новые веяния, и спикеры поделятся наиболее интересными на их взгляд приемами решения классических задач — «новыми neat-трюками».

В каких задачах можно использовать GPU вместо CPU и при чем тут плюсы? Почему то, чему нас учили, — O (n) — на практике бывает быстрее, чем O (log n)? Что находится в сердце игрового движка? Почему Immediate UI так популярен в геймдеве, и как он ломает мозг непосвященным?

В докладе ответят на эти и другие вопросы, чтобы вдохновить вас на распространение этих подходов вне геймдева.

Компиляторы

Агностическая скриптовая система для игрового движка Nau Engine

elimxgqcra6mzqhdwas09e_9pbk.pngАлександр Зеленщиков

Стрим Театр

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

Коротко о Scalar Evolution: как LLVM справляется с проверками диапазонов

bzyq_bntsccgsctj4vzmd91ose4.pngМакс Казанцев

Сбер

Как компилятор на основе LLVM может сделать проверки диапазонов в таких языках, как Java, почти бесплатными, используя движок Scalar Evolution (SCEV)?

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

Автоматизация программирования в СССР: заключительная часть

2nnadss1ha5k5jpympepioydmeu.pngПетр Советов

РТУ МИРЭА

Заключительная часть цикла докладов по автоматизации программирования в СССР (предыдущие доклады: первый, второй).

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

Инструменты

Pets, cattle and automatic operations with code

wmt6qlr8gl_x5sgzbdkqptqu7to.pngСвятослав Фельдшеров

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

Немного обсудим теорию, посмотрим, как использовать инструменты на примере нескольких реальных задач в области авторефакторинга, генерации конфигов по коду и семантического поиска по коду.

LeakSanitizer и менеджмент памяти

ox8_8-9nvpexuipryxrzcufyqu8.jpegАлексей Веселовский

Рассмотрим, как устроен LeakSanitizer. Особое внимание уделим его менеджеру памяти, а также менеджеру памяти ASan. Попробуем через публичный API ASan и LSan увидеть и понять, что происходит внутри менеджера памяти.

Узнаем, как LSan использовать без ASan и почему он, в отличие от ASan, не работает под отладчиком. Конечно же, рассмотрим набор полезных функций из публичного API санитайзеров.

Как не стать драконом

zp8vexbfjn2gtffgj2sqidlwhvy.pngЮрий Минаев

PVS-Studio

ybtewcdfaap5olblbgm3j-rilrs.pngОлег Лысый

PVS-Studio

Все слышали фразу «Убийца дракона сам становится драконом». Но что, если именно этого вы и добиваетесь? В нашем случае дракон — никакой не дракон, а компилятор C++.

Доклад о том, как в PVS-Studio решили написать свой фронтенд. При этом стремясь, чтобы он не выродился в уродливого монстра. Рассмотрим немного теории и узнаем, как рождался парсер с семантической моделью.

Будет полезно тем, кто всегда хотел узнать, что под капотом у компилятора и как он умудряется разбирать такой сложный язык, как C++.

Как работает профилирование

hwxno2hfxawaxalpitt4rjkpj9w.pngВиктор Шампаров

МЦСТ

Профилировщики — важная часть тулинга, которая помогает программистам или компиляторам делать код быстрее.

Известны два подхода к профилированию: инструментирование и сэмплирование. Кратко рассмотрим инструментирование на примере PGO, а на примере perf и иных подобных профилировщиков — сэмплирование. Также обсудим аппаратную поддержку профилирования в некоторых процессорах.

Снова об основах

Back Deep to Basics: Наследование и виртуальность в C++ (Часть 2)

twx2twxwa9qnnc2ghmjigp0joic.pngЕвгений Ерохин

Kaspersky

Наследование, виртуальные функции, v-таблицы, виртуальное наследование — вещи, до боли знакомые каждому C++ разработчику. Но так ли мы хорошо знаем эти механизмы?

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

Корутины для начинающих

jq2hewaus87qrgoc9v0reiv0j0s.pngМарсель Галимуллин

Яндекс Лавка

Корутины, представленные в С++, дают очень много точек кастомизации. И для того, чтобы начать работать с корутинами, нужно обдумать и реализовать все эти точки кастомизации.

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

Concurrency

Как впихнуть невпихуемое, или Давайте параллелить дружно!

avsexkvlbrmw15nohd6oucqhv1w.jpegАнтон Малахов

Huawei

zhzoywf7ol6qsc1gyaig3mhav9y.jpegВиталий Аксенов

Дефицит чипов? Дорогая энергия? Или просто любите использовать железо на 100% и даже больше? Вам покажут на известных бенчмарках, сколько вы теряете. Как это исправить? Можем увеличить скорость обработки задачи с параллельным циклами, использовав концепцию composable parallelism и всего лишь эффективно загрузив систему задачами.

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

Taskflow: A General-purpose Task-parallel Programming System

1bpokgirbox0wipcwaapsgcqjjw.jpegTsung-Wei Huang

University of Wisconsin–Madison

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

CPP4FUN

Добавляем большую языковую модель (LLM) в приложение на С++ с помощью llama.cpp на реальном примере

ahbioel6yjy34msdyy7w9ii6ly4.pngКирилл Колодяжный

YADRO

Кирилл покажет, как использовать инструменты для обработки текста на основе LLM (large language model) на простых компьютерах без подключения к онлайн-API — все будет работать локально. Более того, он покажет, как это сделать на С++, почти не используя другие языки.

Расскажет о наборе утилит и библиотек llama.cpp, и их интеграции в свое приложение для использования современных LLM-моделей. О квантовании и как оно помогает уместить LLM в оперативную память ПК. Как решить проблемы интеграции llama.cpp в приложение. И не только

В итоге научимся обобщать и сравнивать сообщения из Telegram-каналов, чтобы формировать новостную картину.

Другое

Нанять за неделю: как мы перевернули подход в подборе разработчиков на С++, и почему это выгодно всем

g5ycjtiunxij3ca334a3ztqbcp8.pngВиктор Новиков

Kaspersky

rfemlahoflnyilhtzwcnjdr-p5i.pngЮлия Купчинская

Kaspersky

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

Не такие уж стандартные контейнеры, или Улучшенные версии STL-контейнеров из библиотеки Boost

ankbuwxm-el1crcut5lbshry0h0.pngИлья Мещерин

YADRO

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

Обсудим внутреннее устройство «не таких уж стандартных» контейнеров: stable_vector, devector, bimap, circular_buffer, а также интрузивных версий list, map, unordered_map и их разновидностей.

Perforator: Yandex-wide Profiling

4qyvbmpth9hol3cq92_je-bnikc.pngСергей Скворцов

Yandex

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

Заключение

Доклады — это хорошо, но это не всё. Поучаствовать в конференции можно в двух вариантах:

  • Полностью онлайн: все три дня подключаться удалённо

  • С офлайном: 24 мая поучаствовать удалённо (этот день полностью онлайновый), а вот 2–3 мая прийти на московскую площадку лично.

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

Но, конечно, максимум общения происходит на площадке. Там участники и разговаривают друг с другом, и участвуют в активностях на стендах компаний, и подходят к спикерам.

В любом случае, будем ждать вас в том формате, в каком удобно вам — хоть в Москве, хоть в интернете. А напоследок напоминаем главную ссылку на сайт конференции, там и информация, и билеты.

© Habrahabr.ru