Невидимый враг многопоточности: False Sharing и кэш-линии процессора

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

https://habr.com/ru/articles/1032804/

#false_sharing #многопоточность #оптимизация #кэш_процессора #lockfree #кэшлиния #производительность

Невидимый враг многопоточности: False Sharing и кэш-линии процессора

Представьте типичную ситуацию: вы оптимизируете высоконагруженный бэкенд или сетевой сервис. И абсолютно неважно, на чем вы пишете — C++, Java, Go или C#. У вас есть несколько потоков, и вы решаете...

Хабр

[Перевод] Структуры данных на практике. Глава 13: Структуры данных без блокировок

«Блокировки — это goto конкурентного программирования», — Морис Херлихи Проблема 60% Наша система логгинга тратила 60% своего времени на ожидание снятия блокировок. Не на выполнение полезной работы, только на одно ожидание. Восемь ядер, пытавшихся записывать сообщения логов, имели общий кольцевой буфер. Реализация была простой: буфер защищался мьютексом. При высокой нагрузке, когда все ядра записывали логи одновременно, профилировщик демонстрировал ужасный паттерн: 60% тактов CPU тратилось на операции с мьютексом. Пропускная способность: 850 тысяч сообщений в секунду. В восьмиядерной системе она должна быть гораздо выше. «Можно ли улучшить ситуацию, отказавшись от блокировок?», — спросил меня мой менеджер во время ревью производительности. Этот вопрос привёл к полной смене архитектуры...

https://habr.com/ru/articles/1021408/

#мьютекс #lockfree

Структуры данных на практике. Глава 13: Структуры данных без блокировок

«Блокировки — это goto конкурентного программирования», — Морис Херлихи Оглавление Глава 1: Разрыв в производительности Глава 2: Иерархия памяти Глава 3: Бенчмаркинг и профилирование Глава 4: Массивы...

Хабр

@paulmckrcu
Azul has the C4 GC which (I think) uses virtual memory mapping to implement the GC read barrier.

#RCU doesn't do compacting reclamation so memory fragmentation would kill you. But if you had a data structure what didn't do that, like a Michael-Scott #lockfree queue, you could use mmap memory protection to trap any stale references, trap the segfault to restart a restartable RCU locked region.

Приложение real-time face swap на чистом Rust: ONNX Runtime, lock-free потоки и 60 кадров в секунду

Большинство инструментов для замены лиц это Python-скрипты, склеенные из PyTorch, OpenCV и надежды. Они работают, но тащат за собой гигабайты зависимостей, требуют правильно настроенного CUDA и разваливаются в тот момент, когда ты пытаешься запустить их в реальном времени. Мне стало интересно: можно ли собрать весь пайплайн на чистом Rust? Без Python. Без PyTorch. Без обёрток. Один бинарник, который скачал, распаковал и запустил. Оказалось, можно. 60 fps на веб-камере. Пайплайн На каждом кадре последовательно отрабатывают четыре нейросети. RetinaFace находит лица и извлекает пять ключевых точек. ArcFace вычисляет 512-мерный эмбеддинг исходного лица. InSwapper принимает регион целевого лица и эмбеддинг источника, на выходе отдаёт заменённое лицо. GFPGAN опционально улучшает результат для более высокого качества. Все четыре модели работают через ONNX Runtime. Никаких кастомных CUDA-ядер, никакого оверхеда фреймворков. Тензор на вход, тензор на выход. Архитектура потоков Три потока, ноль блокировок на горячем пути. Поток захвата получает кадры с веб-камеры через nokhwa и публикует их через ArcSwap. Поток пайплайна подхватывает новые кадры, прогоняет инференс и публикует обработанные кадры через второй ArcSwap. Поток UI читает актуальный буфер и рендерит через egui. Никаких мьютексов на данных кадра. Никаких каналов. Никакого async. Только атомарные счётчики поколений и lock-free замена указателей. Структуры разделяемого состояния занимают ровно по 64 байта каждая и выровнены по кэш-линиям, чтобы исключить false sharing между ядрами. Это проверяется compile-time ассертами.

https://habr.com/ru/articles/1024700/

#Rust #ONNX #Machine_Learning #Computer_Vision #Face_Detection #egui #Open_Source #lockfree #multithreading #realtime

Приложение real-time face swap на чистом Rust: ONNX Runtime, lock-free потоки и 60 кадров в секунду

Большинство инструментов для замены лиц - это Python-скрипты, склеенные из PyTorch, OpenCV и надежды. Они работают, но тащат за собой гигабайты зависимостей, требуют правильно настроенного CUDA и...

Хабр
Optimizing a Lock-Free Ring Buffer | David Álvarez Rosa | Personal Website

A single-producer single-consumer (SPSC) queue is a great example of how far constraints can take a design. In this post, you will learn how to implement a ring …

David Álvarez Rosa | Personal Website
Deep dive into k-CAS: Vesa Karvonen breaks down sweat-free techniques for concurrent, lock-free programming with clear slides and full speaker notes — perfect for systems engineers and PL enthusiasts. Enlightening and practical! #kCAS #Concurrency #LockFree #ParallelComputing #SystemsProgramming #ProgrammingLanguages #VesaKarvonen #Tarides #English
https://watch.ocaml.org/videos/watch/acebc363-12df-4cd6-aec0-e8239ab325e0
k-CAS for sweat-free concurrent programming by Vesa Karvonen

PeerTube

Три стакана на двоих: самая эффективная коммуникация

Речь пойдет о достаточно типичном для приложений реального времени шаблоне взаимодействия между поставщиком и потребителем информации. Поставщик (писатель) пописывает, потребитель (читатель) почитывает. Асинхронно по отношению друг к другу, каждый — в своём темпе. Обмен происходит отдельными сообщениями, и, как это часто бывает с информацией, привязанной к текущему времени, читателю интересна только самая свежая информация, то есть только последнее сообщение, отправленное писателем. Если какое-то из предыдущих сообщений пропущено — не страшно, всё равно пропущенные данные непоправимо устарели. Наиболее эффективная техника, реализующая подобное взаимодействие, известна как тройная буферизация (Triple Buffering). Именно о ней и о её небольших обобщениях пойдет речь в данной статье.

https://habr.com/ru/articles/1002764/

#atomic #c++ #c++20 #realtime #lockfree #algorithm

Три стакана на двоих: самая эффективная коммуникация

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

Хабр

Tôi đã ra series video ngắn hướng dẫn xây dựng queue single‑producer / single‑consumer (SPSC) từ đầu: triển khai sơ khai, lý do có vẻ đúng, và các vấn đề cache, ordering. Sắp tới sẽ chuyển sang thiết kế lock‑free. Rất mong nhận phản hồi từ những người có kinh nghiệm concurrency. #Concurrency #SPSC #LockFree #LậpTrình #Queue #ĐồngThời #VideoSeries

https://youtube.com/playlist?list=PLHricCAtcO58_4dKgQOzIT6rl9ke5vS1w&si=3NBWV9fsrlKHnylV

From Naive to Lock-Free Queues

A step-by-step journey from naive queue implementations to lock-free designs. We start with intuition, break it with real code, and rebuild queues correctly ...

YouTube
Put a ring on it: a lock-free MPMC ring buffer

Fixed-size ring buffers with full lock freedom

h4x0r

Введение в атомики. C++

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

https://habr.com/ru/articles/972856/

#C++ #atomic #atomicity #lockfree #атомики #атомик

Введение в атомики. C++

Мотивация Заметил недостаток качественных статей по атомикам. Сам когда-то столкнулся с тем, что хотел прочитать статью, где простым и понятным языком рассказывается об этом, но, к сожалению, найти не...

Хабр