Обновить
342.53

C++ *

Типизированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Динамический полиморфизм для свободных функций: еще одна практика из С++ для машинного обучения

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели8.4K

Привет, Хабр! Я Кирилл Колодяжный, разработчик систем хранения данных в YADRO и ML-энтузиаст. Продолжаю рассказывать о паттернах С++, которые легко адаптировать под задачи машинного обучения. В этой части поговорим о динамическом полиморфизме — технологии, которая помогает объединить интерфейс для запуска вычислений с разными условиями. Ссылку на первую часть найдете в конце статьи.

Читать далее

Я пишу свой терминал с нуля, чтобы понять как работает компьютер

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели7.6K

Что происходит, когда вы вводите ls в терминале? Как 2 буквы превращаются в список файлов на экране? Я решил разобраться и написал свой терминал с нуля на C++.

В этой статье я объясняю через метафору ресторана, как работают три магических системных вызова — fork(), exec() и wait() — которые лежат в основе любого терминала. Вы узнаете, почему cd нельзя сделать обычной программой, как работает перенаправление >, и какой коварный баг я поймал из-за непонимания процессов. Без сложной теории — только практика и понятные объяснения.

Читать далее

Вышел новый XBox 360 рекомпилятор RexGlue

Уровень сложностиПростой
Время на прочтение1 мин
Охват и читатели7.1K

Разработан новый рекомпилятор rexglue, что сдвинуло камень с места и привело к новому витку развития рекомпиляции

В отличие от XenonRecomp код более универсален, соответственно сам создает toml таблицу функций проекта.

Читать далее

Долгожданный оператор _Countof

Уровень сложностиСредний
Время на прочтение27 мин
Охват и читатели7.8K

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

Читать далее

mutex vs futex

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели10K

Сравним разные варианты реализации блокировок с точки зрения накладных расходов. mutex, ptr, atomic в нескольких вариантах. Рассматриваем случай без контеншена.

Читать далее

От MNIST к Transformer. Hello CUDA. Основы, Setup и наше первое ядро

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели8.1K

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

Я хочу запустить большой цикл статей От MNIST к Transformer, цель которого пошагаво пройти путь от простого CUDA ядра до создания архитектуры Transformer - фундамента современных LLM моделей. Мы не будем использовать готовые высокоуровневые библиотеки. Мы будем разбирать, как все устроено под капотом, и пересобирать их ключевые механизмы своими руками на самом низком уровне. Только так можно по настоящему понять как работают LLM и что за этим стоит.

Приготовьтесь, будет много кода на C++ и CUDA, работы с памятью и погружения в архитектуру GPU. И конечно же математика что за этим стоит. Поехали!

Читать далее

Я добавил трейты и указатели в свой язык

Время на прочтение30 мин
Охват и читатели8.7K

Язык активно улучшается, осталось недолго до bootstrapping'а! Также уменя есть планы писать LSP и загрузить язык на github linguist. Для последнего нужны репозитории (>200). Для тех, кому нечего делать, или кому просто не лень, попробуйте пописать программки на моем языке. Пока мало что можно будет написать, но, думаю, хотя бы что-то можно.

Читать далее

Своя байт-код VM, шейдеры и 3 килобайта на всё: как я создавал игру за 7 дней

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели12K

Как уместить полноценный Shoot ’em up в 3 КБ? Когда иконка на вашем раб столе весит в несколько раз больше. Однако в эпоху терабайтных дистрибутивов всё еще жива магия сайз-кодинга — искусства втиснуть максимум смысла в минимум байт.

Этот проект родился в рамках одного геймджема, где по правилам: «Вначале нужно придумать свой язык программирования, а потом написать на нём игру». У меня было 7 дней, чтобы пройти путь от проектирования архитектуры байт-кода до финальной оптимизации исполняемого файла под Windows.

Читать далее

Немного об операторах New и Delete | C++

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели8.7K

Углубленный взгляд на устройство работы New | Delete

Переопределение, new_handler, типы new, внутренняя реализация

Читать далее

Маски, Каскады, использование масок вместо циклов(В некоторых случаях) + Атомарные инструкции

Уровень сложностиСложный
Время на прочтение12 мин
Охват и читатели9.4K

Привет Хабр!

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

Читать далее

Vulkan API. От нуля до первого треугольника

Уровень сложностиСредний
Время на прочтение35 мин
Охват и читатели12K

Приветствую вас, дорогие читатели! В этой статье мы разберёмся в том, как нам добраться от самого нуля до первого треугольника. Мы будем использовать Vulkan API 1.0, а затем будем переходить к всё более и более новым версиям этого API. Это моя первая авторская статья, поэтому прошу вашей поддержки. Цель данной статьи - разъяснить процесс отрисовки треугольника так, чтобы любой мог не просто нарисовать треугольник, а понять как устроен простейший рендеринг на Vulkan API на примере отрисовки треугольника.

Читать далее

OpenCL, SYCL и матрицы

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели9.1K

В данной статье я описываю свой опыт разработки приложений с OpenCL/SYCL.

Вычисления на видеокартах ассоциируются преимущественно с графикой, научными вычислениями и с недавних пор с нейросетями. Но чаще всего с графикой.

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

Самый краткий ввод в гетерогенное программирование: у нас есть две роли — хост и девайс, задача хоста – формировать задачи и отдавать их на девайс, в то время как задача девайса обработать их и вернуть результат. При этом хост и девайс могут быть одним вычислительным устройством (это не обязательно CPU + GPU, так как CPU может отдавать задачи сам себе).

Читать далее

Используем паттерны C++ в ML: пишем тензор с factory, выделяем память и управляем динамическими типами

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели8.5K

Привет, Хабр! Я Кирилл Колодяжный, разработчик систем хранения данных в YADRO, ML-энтузиаст и автор книги "Hands-on Machine Learning with C++". В своих материалах я развеиваю миф о том, что машинное обучение — это сплошной Python. На самом деле под капотом моделей часто работает C++.

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

Читать далее

Ближайшие события

Солнечный трекер на Arduino

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели10K

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

Данная реализация является моделью для прототипа. Описание полной сборки и настройки, как и сборки многих других занимательных устройств я описал в своей книге "Умная робототехника для начинающих. Разработка на Arduino".

Для создания работающей модели нам понадобяться прочный, но лёгкий материал, на котором будет производиться монтаж электрокомпонентов и сам он будет использоваться в качестве несущей конструкции. Можно выбрать вспенённый пвх лист 3 мм или листовой прозрачный пластик 1,5-3 мм. Так же подойдёт корпус из под лазерных дисков.

Нам нужны электрокомпоненты. Я возьму: arduino uno, два сервопривода- четыре фоторезистора, четыре резистора на 1 кОм, соединительные провода, плата для монтажа (можно беспаечную).

Чтобы производить монтаж электроники, вырезать и собирать конструкцию трекера нам нужны инструменты. Я воспользуюсь: канцелярским ножом и ножницами, клеем для пластика или термоклеем, карандашом, линейкой или штангенциркулем, наждачной бумагой мелкой фракции, паяльной станцией с припоем и канифолью.

Фоторезисторы в этом устройстве будут работать, как датчики света. Располагаться они должны по краям подвижной платформу. С какой стороны более яркий свет – в ту сторону и поворачивается устройство.

Читать далее

SIMDe, дополнение к DOD архитектуре

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели12K

Привет, Хабр!

Для начала хочу сказать огромное спасибо всем, кто прочитал и прокомментировал мою прошлую статью про Data-Oriented Design.

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

Я внимательно изучил все ваши аргументы — от «компилятор сам всё сделает» до «это невозможно поддерживать в реальных проектах». И вместо того, чтобы отвечать каждому в ветке комментариев, я решил подготовить этот материал.

Многие из вас совершенно справедливо заметили: DOD — это круто, но какой в нем смысл, если мы упираемся в зоопарк архитектур? Мы раскладываем данные в памяти идеально ровно, но как только пытаемся применить к ним SIMD-инструкции (чтобы получить тот самый 10-кратный буст), мы попадаем в ловушку вендор-лока. Написал под Intel — не работает на ARM. Написал под ARM — не заведется в браузере.

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

Речь пойдет о SIMDe (SIMD Everywhere).

Читать далее

Система частиц в The 13th Sign

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели11K

Доброго дня всем!

Мыс друзьями делаем инди‑игру The 13th Sign, и недавно выпустили первый трейлер, он же — техническое демо. После чего в узких кругах возник широкий круг вопросов формата «как это работает». Ниже — все детали реализации.

Читать далее

Инвертирование равенства. Как реже стрелять себе в ногу в C-подобных языках

Время на прочтение7 мин
Охват и читатели7.3K

Встав утром и посмотрев в профиль, отметил: на Хабре много лет, писал статьи, писал код. И ни разу не писал о коде на Хабре. А вообще‑то разработчик. Поззорище! Пора исправляться.

Поговорим о классической (и болезненной) проблеме кодирования «присваивание вместо равенства» которая в любой момент может создать очень много проблем. О логическом источнике этой ошибке, и о способах решения.

Ну и ещё слегка вспомним «Звездные войны»:-)

Силу инверсии равенства познай на себе :)

Игра Сапёр на Unreal Engine > UMG > только C++ > Никаких Блупринтов

Время на прочтение5 мин
Охват и читатели11K

Захотелось мне как-то написать что-нибудь на UMG в Unreal Engine 5 и исключительно на С++ (без использования блупринтов). Заодно было любопытно краем глаза взглянуть на QT. “Пахнет небольшим проектом”, - подумал я и избрал для вдохновения игру “Сапёр” из сего репозитория -> https://github.com/Bollos00/LibreMines. Моё почтение автору той репы!

Началось всё с бездумного и медитативного переписывания… простите, портирования структуры и логики на анриловский UMG и параллельного просмотра любимых шоу на ютьюбе. Чудесное было время! Далее чуть подрефачил код, упростил его, убрал ненужное, и получилось то, что получилось. 

А ну-ка...

Cистема визуально-инерциальной навигации для дрона на C++

Уровень сложностиСложный
Время на прочтение10 мин
Охват и читатели20K

Дроны, которые работают на GPS, глушатся и это большая проблема для летательных аппаратов. Сигнал от спутников GPS проходит около 20 000 км и достигает антенны дрона с минимальной мощностью. Любая наземная глушилка, излучающая шум на частотах L1/L2/L5, для приемника дрона оказывается в тысячи раз громче спутников. Приемник слепнет, дрон теряет координаты, переходит в аварийный режим и сносится ветром.

И поэтому нам нужна MVIO (Monocular Visual Inertial Odometry).

Это технология, которая позволяет дрону понимать свое положение в пространстве, используя только одну камеру и IMU. В этой статье мы разберем реализацию такой системы на C++. Мы увидим, как объединить видеопоток и данные акселерометра в реальном времени, используя фильтр Калмана и библиотеку OpenCV.

Читать далее

Как я пытался внедрить IOCP в libcoro, выгорел на полгода, но вернулся с планом «Б»

Уровень сложностиСредний
Время на прочтение23 мин
Охват и читатели6.2K

Что делать, если в твоём очередном самописном движке внезапно понадобилась сеть, да ещё и на корутинах из C++ 20, а подходящая библиотека не поддерживает Windows? Правильно - лезть под капот, разбираться что такое epoll, почему он несовместим с IOCP, затем вкатиться в Open Source, сделав огромный PR, выгореть на полгода, чтобы потом вернуться и начать делать нормально.

Небольшая история о том, почему первый PR не должен быть огромным и как (не) нужно переписывать сетевую библиотеку.

Читать далее