Обновить
455.63

C++ *

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

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

От MNIST к Transformer. Часть 3. Умножение тензоров. Пишем Linear Layer

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

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

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

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

Читать далее

Новости

Работаем с контейнерами в C++ с помощью библиотеки Ranges

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

Понятие контейнер сейчас активно применяется в контексте Docker и аналогичных решений по контейнеризации. Однако, в языке C++ контейнеры существуют уже очень давно и являются фундаментальной частью Standard Template Library (STL). Они предоставляют готовые реализации наиболее часто используемых структур данных, избавляя разработчика от необходимости писать их с нуля.

Контейнеры C++ можно разделить на несколько основных категорий. Последовательные контейнеры (Sequence Containers) хранят элементы в линейной последовательности, при этом порядок элементов определяется позицией добавления. Ассоциативные контейнеры (Associative Containers) автоматически сортируют элементы по ключу. При этом, они обеспечивают достаточно быстрый поиск (O(log n)). Неупорядоченные ассоциативные контейнеры (Unordered Associative Containers) хранят элементы в хеш-таблицах. Обеспечивают поиск в среднем за O(1). Адаптеры контейнеров (Container Adapters) предоставляют ограниченный интерфейс поверх других контейнеров.

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

Читать далее

Черная магия unsafe в Go: практические примеры и ошибки использования. Часть 1

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

В стандартной библиотеке Go есть пакет с отпугивающим названием «unsafe». Но он может быть реально полезен! Сегодня поговорим о том, как использовать его надежно и эффективно.

Привет, Хабр! Я — Владимир Балун, основатель balun.courses и it-interview.io. Эта статья будет для удобства разделена на две части. Из них вы узнаете, как можно создавать срезы без дорогостоящей инициализации, научитесь избавляться от Bound Checks и конвертировать строки в срезы и обратно без лишних копирований и аллокаций памяти. 

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

Читать далее

Мой плохой код — это ваша вина

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

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

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

Разумеется, по эго это бьёт иногда больно, и некоторые моменты вспоминать не очень приятно. Самое страшное, что я когда-либо делал — коммитил приватный ключ в публичной репо. Вот написал и мне опять стыдно. Но я осознаю, что это всё я.

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

Сейчас я вам это покажу. Будет интересно, но впереди много боли. Я предупредил.

Хочу страдать

Почему у нас нет кешей L5?

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

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

Первое, что нужно понять: процессор не является абстрактным вычислителем, а вполне себе реальный кусок кремния размером примерно с ноготь большого пальца, на котором размещены миллиарды транзисторов и когда мы говорим «данные передаются из памяти в регистр», то мы буквально имеем в виду, что электрический сигнал проходит по металлическому проводнику длиной в несколько миллиметров или сантиметров. И это тоже расстояние, пусть и ничтожное по человеческим меркам, но при тактовой частоте 3–4 ГГц оно уже имеет значение, просто потому что за один такт сигнал в идеальных условиях будет проходить всего 10 сантиметров, а в металлическом проводнике на кристалле и того меньше.

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

Читать далее

АСУТП на молочном заводе и я: 2004 — настоящее время

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

АСУТП — основа современной промышленной автоматизации и инфраструктуры
управления. SCADA-система (Supervisory Control and Data Acquisition) является
частью, которая обеспечивает интерфейс между операторами и оборудованием, а
также сбор и анализ данных в реальном времени. Обычно это программный пакет,
предназначенный для обеспечения работы системы и/или разработки таких систем, —
сухое определение, которое заставляет вспоминать предмет ТАУ (теория
автоматического управления) и ПИД-регулятор. Ничего интересного — одни формулы.
Такие мысли мне тоже приходили в голову в момент распределения после завершения
учебы в университете. Так получилось, что на последнем курсе устроился работать
в классическую IT-контору, но не остался там надолго и пошёл пробовать себя на
молочный завод — в тогда ещё молодой отдел АСУТП. Что из этого вышло, далее попытаюсь
рассказать в этой статье.

Читать далее

Принципы DOD в C++: Часть 2. AoS, SoA. Мнимая панацея для быстродействия

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

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

Читать далее

Создание библиотеки на C++: Теги, признаки и концепции. Часть II

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

Привет! Меня зовут Николай, я C++-разработчик в SimbirSoft. Это продолжение цикла статей о проектировании библиотек на примере решения геометрических задач. В первой части мы разобрали классическое наследование с виртуальными функциями и использование шаблонов, сравнили их сильные и слабые стороны и посмотрели, какие ограничения возникают при расширении системы.

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

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

Для комфортного чтения потребуется уверенное знание базового синтаксиса C++, понимание шаблонов и частичной специализации, а также общее представление о статическом и динамическом полиморфизме. Текст ориентирован на разработчиков уровня middle и выше, но может быть полезен всем, кто хочет глубже разобраться в архитектурных возможностях современного C++.

Читать далее

Медицинский экзоскелет

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

Короткий дисклеймер Я очень хочу, чтобы эта статья была просто научной работой. Чтобы никогда и никому не понадобился мой экзоскелет. К сожалению, пока это не так. По статистике у каждого есть хотя бы один близкий, кому он необходим.

Коротко о себе. Я инженер-конструктор с большим опытом. Работал много лет в космической отрасли. Сейчас я программист на удалёнке. Но не из-за денег я поменял работу. У меня отказали ноги из-за тяжёлой формы рассеянного склероза. К слову, со старческим он никакого отношения не имеет. Отказали не только ноги. Плохо слушаются и руки. Эту статью я набиваю голосом. Вообще, повреждение спинного мозга – это ад. Не как в кино, гораздо страшнее. Но речь пойдёт о другом.

Тема далеко не новая. Есть рынки, есть исследования, есть много всего. Но есть как минимум две причины, почему это научная фантастика. Первое это цена. В лучшем случае это цена новой машины. Второе это то, что в личное пользование это купить нельзя.

Читать далее

Blueprint VM изнутри: ~80 инструкций, которые двигают вашу игру

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

Каждый раз, когда вы соединяете ноды в Blueprint и нажимаете Play, Unreal Engine запускает маленький процессор. У него свои инструкции, свой стек, своя защита от бесконечных циклов. Он написан в ~4000 строках C++ и живёт в одном файле. Через него проходит каждый Event Tick, каждый Event BeginPlay, каждый вызов Blueprint-функции.

Этот процессор - Blueprint VM (Virtual Machine). И сегодня мы разберём его по винтикам.

Читать далее

Unreal Engine 5.4 + C++ + MacOS Tahoe + Android build = Build Successful

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

Небольшая инструкция для всех, кто работает в Unreal Engine и пишет на C++ или иных языках + компилирует файлы для Андроид.

Читать далее

Функциональный язык программирования Hobbes

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

Hobbes - это функциональный язык программирования со статической типизацией, написан на С++ и включает JIT-компилятор на базе LLVM. Похож на Haskell, но совсем не такой же революционный и гораздо менее известен. Я немного расскажу, что это за язык и как он устроен внутри.

Что ещё за Hobbes?

Как портировать XBOX 360 игру на ПК с помощью RexGlue (2 часть)

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

После того, как вы настроили rexglue (https://habr.com/ru/articles/1002640/), можно переходить к следующему этапу.

Скачиваем iruka-demo, демо-версию с дельфином https://github.com/rexglue/demo-iruka

Читать далее

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

Нескучное программирование. Обобщения (ч.1)

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

Представьте на минуту, что C++ — это не набор странных ключевых слов и ошибок линковки, а всего лишь ещё один способ поговорить о мире вокруг нас: о людях, числах, цветах, событиях и котах. Мы привыкли думать о программировании как о чём‑то сугубо техническом, где важно запомнить синтаксис, расставить точки с запятой и “угадать”, чего сейчас хочет компилятор. 

Но если задать себе вопрос «а чем вообще оперирует программа?», внезапно выясняется, что за всеми этими int, struct и template прячутся довольно простые и понятные идеи: вещи, их свойства, группы похожих вещей и правила, по которым одни вещи превращаются в другие.

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

Когда философы и логики говорят об абстрактных сущностях, они имеют в виду индивидуальные вещи, которые не существуют в пространстве и времени так, как существуют стол, человек или компьютер, а как нечто неизменное: например, число 13 или сам по себе синий цвет не родились в какой‑то момент и не "умирают" через какое‑то время, это не объекты физического мира, а идеи, с которыми мы работаем в голове и в математике. 

Читать далее

Mini-Shell: Часть 2 — Pipes, фоновые процессы и управление задачами

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

Это продолжение серии. Если вы не читали первую часть, рекомендую начать с неё: https://habr.com/ru/articles/1000766/

Читать далее

Почему первый вызов моей malloc всегда аллоцирует 72 КБ?

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

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

Коротко о теме статьи. Стандартная библиотека C++ инициализирует механизм обработки исключений на раннем этапе, выделяя память для «резервного пула», чтобы можно было использовать её под выброс исключений, если malloc вдруг провалится.

Читать далее

Управление предпусковым подогревателем Webasto

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

Добрый день, в контексте моего хобби по схемотехнике и программированию микроконтроллеров появилась идея реализовать устройство для дистанционного запуска предпускового котла Webasto, в моем случае это "Webasto Thermo Top Evo 5". Вероятно предложенный материал подойдет и для реализации устройств управления для схожих отопителей данной марки работающих по протоколу W-bus.

Читать далее

Flame: Системный язык программирования на C и LLVM с мета-исключениями и Memory Safety без Borrow Checker

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

Пока индустрия движется в сторону усложнения компиляторов, я задался вопросом: можно ли создать инструмент, который дает безопасность Rust, гибкость C и при этом не весит сотни мегабайт?

Так появился Flame — системный язык с компилятором в 226 КБ, который реализует управление памятью через статический анализ AST и предлагает альтернативный взгляд на обработку ошибок через патчинг дерева токенов.

Читать далее

Превращаем MIDI клавиатуру в синтезатор. Часть 1. Железо

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

Все началось со статьи Как собрать клон Yamaha DX7 за 10$. Так как я достаточно давно занимаюсь музыкой, и люблю конструировать всякие электронные штучки, меня эта статья заинтересовала. Я тут же начал прикидывать по цене возможные варианты. RPI2040 конечно же очень дешево, но посмотрев пару обзоров на Picodexed на YouTube, меня не привлекла простенькая синтезаторная составляющая. Понятно, что это полная эмуляция движка Yamaha DX7, но слишком уж звук невзрачный и простой. После просмотра вариантов эмуляторов синтезаторов на RPI на YouTube меня больше заинтересовали проекты MiniDexedMT32-pi и Mini-JV880

Читать далее

Робот с видеонаблюдением и отслеживанием объекта

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

Введение

Данный проект, является логическим продолжением развития темы "Солнечный трекер на Arduino".

Используя базу солнечного трекера (его конструкцию) и web-камеру можно собрать роботизированную конструкцию, которая будет отслеживать в режиме реального времени назначенный маркер или группу маркеров в определённой области пространства.

Распознавать маркеры можно по разным критериям: выбранному цвету, текстуре, форме и т.д.

Я выбрал второй вариант. Делаю фото объекта web-камерой, с выбранным однородным цветом, которую буду использовать на роботе.

Подготовка ПО

Для корректной работы программы вам нужно:

1. Установить Python https://www.python.org/

2. Установить модули numpy, opencv и pyserial используя инструмент pip https://pypi.org/project/numpy/

https://pypi.org/project/opencv-python/

https://pypi.org/project/pyserial/

3. Установить Arduino ide

https://learnlange.blogspot.com/p/blog-page_28.html

Сборка робота

Система представляет стационарную установку с двумя степенями свободы, которые позволяют вращаться в пространстве цилиндрической формы. На верхней части системы закреплена USB web-камера (её можно заменить на smart камеру или ip камеру).

Для быстрого создания прототипа использую образовательный набор КЛИК: базовый и ресурсный
Поворотные механизмы реализованы с использованием DC моторов с понижающей передачей.

Читать далее
1
23 ...