Pull to refresh
2
0
Send message

Как оптимизировать код на С для x86-процессоров: подсистема кэша и памяти, инструкции AVX-512

Level of difficultyMedium
Reading time12 min
Views8.9K

Меня зовут Андрей Бакшаев, я ведущий инженер-программист в YADRO. Моя команда занимается разработкой и оптимизацией математических библиотек под архитектуру x86. До этого я 15 лет работал в Intel. Значительная часть моих задач заключалась в том, чтобы реализовывать некоторые алгоритмы обработки изображений и сигналов в довольно известной математической библиотеке IPP, максимально эффективно используя возможности процессоров. Я также исследовал производительность этих алгоритмов в процессорах на ранней стадии проектирования. 

В статье я поделюсь своим опытом оптимизации низкоуровневого кода на языке C. Рассмотрим подсистему кэша и памяти процессоров и новые инструкции AVX-512. Разберем пример ускорения копирования байтового массива данных и посмотрим, как векторизованный код позволяет сократить время работы широко используемого алгоритма замены байтов по таблице с 619 до 34 мс, то есть примерно в 18 раз. 

Читать далее
Total votes 54: ↑51 and ↓3+48
Comments23

Подробное введение в rvalue-ссылки для тех, кому не хватило краткого

Reading time17 min
Views72K

Вместо КДПВ — короткая драма для привлечения внимания, основанная на реальных событиях. Ее можно смело пропустить и перейти к статье, которая поможет вам разобраться в rvalue-ссылках, конструкторах перемещения, универсальных ссылках, идеальной передаче (perfect forwarding) и т. д.


Драма в трех действиях


Действие первое


Компилятор. Локальный объект x типа T, проживающий на стеке, вы приговариваетесь к изъятию у вас всего имущества в связи с тем, что не будете пользоваться им до конца своей жизни.


Объект x. Что? Я не какой-то там временный объект, у меня постоянная регистрация, вы не имеете права!


Компилятор. Никто вас не выселяет. Но согласно одиннадцатой редакции стандартного кодекса, все ваши вещи будут переданы другому объекту, которому они нужны больше.


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

Читать дальше →
Total votes 35: ↑33 and ↓2+31
Comments19

Сколько стоит умный дом? Рассказываю, как строил свой и что получилось за 1000 руб./м²

Level of difficultyEasy
Reading time25 min
Views94K

Подробный рассказ о том, как я свой дом и сад сделал умными. С фото, техническими деталями, стоимостями и выводами на будущее.

Читать
Total votes 300: ↑298 and ↓2+296
Comments296

Руководство по CMake для разработчиков C++ библиотек

Reading time18 min
Views76K

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

Читать далее
Total votes 71: ↑71 and ↓0+71
Comments49

Особенности реализации STL в Clang, GCC и Microsoft С++

Reading time21 min
Views20K

Любая программа состоит из данных и алгоритмов их обработки. Для написания программ на C++ в начале 90-х годов прошлого века Александр Степанов с коллегами разработал библиотеку STL. Я, Михаил Полукаров из команды разработки VK Teams, заглянул под капот этой библиотеки чтобы разобраться, как правильно ей пользоваться, в каких случаях лучше использовать другие библиотеки, а в каких стоит написать что-то своё. 

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

Читать далее
Total votes 79: ↑77 and ↓2+75
Comments12

Приседания по программе Пола Уэйда

Reading time22 min
Views48K

image


Техника / как выполнять


Правило первое: правильная постановка ног


Перед началом приседаний надо посмотреть на позицию ног. Также как ладони продолжают руки, так и от положения ступней зависит позиция ног. Начинайте, расположив ступни симметрично с носками развёрнутыми наружу под углом 30-40 градусов. Однако, продолжайте экспериментировать, чтобы добиться удобного положения под себя. Колени смотрят в ту же сторону, что и носки. Они не должны быть параллельны друг другу.


image


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


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

Читать дальше →
Total votes 44: ↑32 and ↓12+20
Comments32

В нативный код из уютного мира Java: путешествие туда и обратно (часть 1)

Reading time18 min
Views29K


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


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


Иван Углянский (dbg_nsk) из Huawei разбирается со всем по порядку: что необычного в интеропе между Java и нативным кодом, как оно работало раньше и что нужно делать для их нормальной совместной работы (и можно ли это вообще сделать). Иван рассказывает, как избежать просадок производительности, внезапных OOM и размышляет на тему будущего — в контексте проектов Panama и Sulong.


Мы подготовили текстовую версию доклада о работе с нативами в Java. В первой части:


  • Зачем вообще работать с нативным кодом в Java.
  • С какими ошибками и проблемами придётся столкнуться при работе с нативами.

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


Далее — повествование от лица спикера.

Читать дальше →
Total votes 55: ↑55 and ↓0+55
Comments19

Мой топ IT книг из прошлого века, актуальных до сих пор

Reading time5 min
Views64K

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

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

В данном топе книги не упорядочены по важности, они все очень хорошие, но есть одна книга, которая равнее других.

Читать далее
Total votes 69: ↑68 and ↓1+67
Comments55

Как выбрать красивые цвета для вашей инфографики

Reading time10 min
Views38K


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

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

Статья не поможет найти хорошие градиенты или оттенки. Она предназначена для подбора красивых, чётких цветов для различных категорий информации (например, континентов, отраслей промышленности, видов птиц) в линейных, круговых, полосковых диаграммах и так далее.
Total votes 46: ↑45 and ↓1+44
Comments6

Основы компьютерной геометрии. Написание простого 3D-рендера

Reading time30 min
Views50K
Привет меня зовут Давид, а вот я собственной персоной отрендеренный своим самописным рендером:

image

К сожалению я не смог найти более качественную бесплатную модель, но все равно выражаю благодарность заморскому скульптору запечатлевшему меня в цифре! И как вы уже догадались, речь пойдет о написании CPU — рендера.
Читать дальше →
Total votes 45: ↑44 and ↓1+43
Comments21

Симуляция подъёмной силы Ньютона методом частиц на CUDA

Reading time22 min
Views14K

https://www.youtube.com/playlist?list=PLwr8DnSlIMg0KABru36pg4CvbfkhBofAi


Как-то на Хабре мне попалась довольно любопытная статья “Научно-технические мифы, часть 1. Почему летают самолёты?”. Статья довольно подробно описывает, какие проблемы возникают при попытке объяснить подъёмную силу крыльев через закон Бернулли или модель подъёмной силы Ньютона (Newtonian lift). И хотя статья предлагает другие объяснения, мне бы всё же хотелось остановиться на модели Ньютона подробнее. Да, модель Ньютона не полна и имеет допущения, но она даёт более точное и интуитивное описание явлений, чем закон Бернулли.


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


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


Перед тем как мы начнём, я бы хотел сразу обозначить, что это статься не о физике самой модели. Эта статья о GPGPU-программировании. Мы не будем рассматривать физические свойства самой модели, потому что она груба и не подходит для настоящих расчётов. И всё же, эта неточная модель даёт куда более интуитивное описание явления подъёмной силы, чем закон Бернулли.

Total votes 66: ↑65 and ↓1+64
Comments46

Sparse residency текстуры в Vulkan

Reading time12 min
Views4.2K
Текстуры делают компьютерную графику насыщенной. Размер текстур имеет значение, маленькие текстуры при сильном приближении дают картинку с огромными пикселями, или мылом. Про то, как же рисовать огроменные текстуры и будет эта статья.

image
Читать дальше →
Total votes 21: ↑21 and ↓0+21
Comments3

Параллели между Factorio и проектированием ПО

Reading time5 min
Views19K

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

Я играл в две такие игры. Первая — это Shenzhen.io. Она похожа на то, чем бы мог заниматься инженер, проектирующий встроенные устройства. Инженер решает головоломки путём писания ассемблерного кода для устройств с низким энергопотреблением. В этой игре здорово то, что её разработчики убрали из неё раздражающие аспекты написания кода и его ввода в эксплуатацию.

  • Требования понятны и на удивление точно соответствуют задаче.
  • Цикл редактирования, отладки и компиляции невероятно быстр. Благодаря этому, а также отличной системе тестирования можно за минуту проверить несколько потенциальных решений.
  • Платформа, от которой зависит код игрока (сама игра) не имеет багов. Не нужно чинить зависимости перед тем, как приступать к написанию собственного кода.

Должен ли проектировщик ПО сыграть в Shenzhen.io? Геймплей этой игры не для каждого. Некоторым он «слишком напоминает работу». В конце концов, играя, хочешь расслабиться, а не работать над задачами, которые уже выполняешь по восемь часов в день. Несмотря на это, я считаю, что стоит сыграть, просто чтобы понять, насколько интересной становится задача, когда требования понятны, а средства разработки — быстры. Все знают, что инвестирование в развитие и инструменты оправдывает себя, но удовольствие от игры подкрепляет это ощущение.

Вторая игра — это Factorio, которую выпустили в прошлую пятницу, хотя в раннем доступе в неё можно было играть уже почти четыре года. Те, кто в неё играл, сейчас, вероятно, недоумевают — ведь это игра о постройке фабрики, а не о кодинге. Игрок работает с конвейерами, металлом, нефтепродуктами и создаёт ресурсы, необходимые для изготовления космического корабля.
Total votes 23: ↑23 and ↓0+23
Comments18

Ох уж этот std::make_shared…

Reading time6 min
Views34K
C++ Core Guidelines содержат правило R22, предписывающее использовать std::make_shared вместо вызова конструктора std::shared_ptr. В Core Guidelines приводится всего лишь один аргумент за такое решение — экономия на аллокации (и деаллокации).

А если копнуть чуть глубже?
Читать дальше →
Total votes 27: ↑24 and ↓3+21
Comments46

Общедоступные данные дистанционного зондирования Земли: как получить и использовать

Reading time7 min
Views24K

Дистанционное зондирование Земли (ДЗЗ) — наблюдение поверхности Земли наземными, авиационными и космическими средствами, оснащёнными различными видами съемочной аппаратуры [википедия]. Поговорим о возможностях, предоставляемых бесплатными и общедоступными данными. Всего не перечислить, поэтому расскажу только о том, с чем я сам работаю, все примеры кода и картинки мои собственные. Исходный код по ссылкам представлен на языке Python 3 в виде Jupyter Notebooks на GitHub.


Картинка ниже показывает смещение поверхности Земли относительно спутника (красным цветом обозначено смещение вверх и синим — вниз) в результате землетрясения (6.5 баллов) — как видим, горы "подросли" (на 20-30 см) и долины углубились (на 15-20 см). Можно ли это замерить локально? Да, с помощью сети наземных приемников GPS, для которых местоположение можно вычислить с очень высокой точностью, но это дорого и сложно, а точность спутниковых наблюдений уже превосходит наземные. Кстати, показанная интерферограмма вычислена за пару часов на обычном лаптопе с помощью Open Source утилит GMTSAR (фактически, это расширение для знаменитых в области наук о Земле утилит GMT).



Как растут горы — спутниковая интерферограмма землетрясения магнитудой 6.5 баллов в Монте Кристо, Невада, США

Читать дальше →
Total votes 15: ↑15 and ↓0+15
Comments10

Приточная вентиляция совмещенная с канальным кондиционером (часть 2 — водяная)

Reading time14 min
Views18K
drawing

Хочу поделиться опытом проектирования, монтажа и эксплуатации своей системы приточной вентиляции совмещенной с канальным кондиционером. Система
собиралась в 2012-2013 годах и с тех пор находится в постоянной эксплуатации.


Статью разделил на две части:


  • в первой части была описана классическая схема приточная вентиляции с использованием электрического канального подогревателя
  • в этой части расскажу про неоднозначный опыт переработки системы под водяной калорифер с питанием от общедомовой системы отопления
Читать дальше →
Total votes 16: ↑16 and ↓0+16
Comments44

Алгоритм быстрого и простого объёмного рендеринга

Reading time9 min
Views14K

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

У моего ShaderToy были три основные задачи:

  1. Выполнение в реальном времени
  2. Простота
  3. Физическая корректность (… или типа того)

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

  1. Трассировка лучей непрозрачных объектов. Все объекты являются примитивами с простыми пересечениями с лучами (1 плоскость и 3 сферы)
  2. Для вычисления освещения используется затенение по Фонгу, а в трёх сферических источниках света применется настраиваемый коэффициент затухания света. Лучи теней не требуются, потому что мы освещаем только плоскость.

Вот как это выглядит:

ShaderToy screenshot
Читать дальше →
Total votes 52: ↑52 and ↓0+52
Comments6

Приточная вентиляция совмещенная с канальным кондиционером (часть 1 — электрическая)

Reading time11 min
Views75K

схема_малая


Хочу поделиться опытом проектирования, монтажа и эксплуатации своей системы приточной вентиляции совмещенной с канальным кондиционером. Система
собиралась в 2012-2013 годах и с тех пор находится в постоянной эксплуатации.


Статью разделил на две части:


  • в первой части описана классическая схема приточная вентиляции с использованием электрического канального подогревателя
  • во второй части рассказано про неоднозначный опыт переработки системы под водяной калорифер с питанием от общедомовой системы отопления
Читать дальше →
Total votes 60: ↑59 and ↓1+58
Comments229

Первое впечатление от концептов

Reading time8 min
Views18K


Решил разобраться с новой возможностью С++20 — концептами.

Концепты (или концепции, как пишет русскоязычная Вики) — очень интересная и полезная фича, которой давно не хватало.

По сути это типизация для аргументов шаблонов.

Основная проблема шаблонов до С++20 — в них можно было подставить все что угодно, в том числе то, на что они совершенно не рассчитаны. То есть система шаблонов была совершенно нетипизирована. В результате, при передаче в шаблон неверного параметра возникали невероятно длинные и совершенно нечитаемые сообщения об ошибках. С этим пытались бороться с помощью разных языковых хаков, которые я даже упоминать не хочу (хотя приходилось сталкиваться).

Концепты призваны исправить это недоразумение. Они добавляют в шаблоны систему типизации, причем весьма мощную. И вот, разбираясь с особенностями этой системы, я стал изучать доступные материалы в интернете.

Скажу честно, я немножко в шоке:) С++ и без того сложный язык, но тут хотя бы есть оправдание: так получилось. Метапрограммирование на шаблонах именно открыли, а не заложили при проектировании языка. А дальше, при разработке следующих версий языка, были вынуждены подстраиваться под это «открытие», так как в мире было написано очень много кода. Концепты же — принципиально новая возможность. И, как мне кажется, в их реализации уже присутствует некоторая непрозрачность. Возможно, это следствие необходимости учесть огромный объем унаследованных возможностей? Попробуем разобраться…
Читать дальше →
Total votes 50: ↑49 and ↓1+48
Comments34
1
23 ...

Information

Rating
Does not participate
Registered
Activity