Наша команда оказывает быструю и эффективную поддержку клиентов. В поддержке принимают участие только программисты, так как вопросы нам тоже задают программисты и над многими из них приходится подумать. Хочется описать одно из недавних обращений в поддержку на тему ложного срабатывания, которое привело к целому небольшому исследованию описанной в письме проблемы.
Читать полностью »
Рубрика «C» - 42
Ускоряем неускоряемое или знакомимся с SIMD, часть 2 — AVX
2019-02-18 в 15:21, admin, рубрики: avx, AVX2, C, c++, simd, sse, высокая производительность, ПроцессорыПредыдущая часть вызвала бурную дискуссию, в ходе которой выяснилось, что AVX/AVX2 на самом деле есть в десктопных CPU, нет только AVX512. Поэтому продолжаем знакомиться с SIMD, но уже с современной его частью — AVX. А так же разберём некоторые комментарии:
- медленнее ли
_mm256_load_si256, чем прямое обращение к памяти? - влияет ли на скорость использование AVX команд над SSE регистрами?
- действительно ли так плохо использовать
_popcnt?Читать полностью »
Ускоряем неускоряемое или знакомимся с SIMD
2019-02-17 в 9:17, admin, рубрики: C, c++, simd, sse, высокая производительность, ПроцессорыЕсть класс задач, которые нельзя ускорить за счёт оптимизации алгоритмов, а ускорить надо. В этой практически тупиковой ситуации к нам на помощь приходят разработчики процессоров, которые сделали команды, позволяющие выполнять операции на большим количеством данных за одну операцию. В случае x86 процессоров это инструкции сделанные в расширениях MMX, SSE, SSE2, SSE3, SSE4, SSE4.1, SSE4.2, AVX, AVX2, AVX512.
В качестве «подопытного кролика» я взял следующую задачу:
Есть неупорядоченный массив arr с числами типа uint16_t. Необходимо найти количество вхождений числа v в массив arr.
Классическое решение, работающее за линейное время выглядит так:
int64_t cnt = 0;
for (int i = 0; i < ARR_SIZE; ++i)
if (arr[i] == v)
++cnt;
В таком виде бенчмарк показывает следующие результаты:
------------------------------------------------------------
Benchmark Time CPU Iterations
------------------------------------------------------------
BM_Count 2084 ns 2084 ns 333079
Под катом я покажу как его ускорить в 5+ раз.
Читать полностью »
MQTT-UDP, предвесенние итоги: дистанционная конфигурация и цифровая подпись
2019-02-15 в 12:06, admin, рубрики: C, IoT, mqtt, openhab, python, smart home, программирование микроконтроллеров, Разработка для интернета вещей, умный домЗима кончается, и это повод подвести очередную черту и рассказать, что нового появилось в MQTT/UDP.
Для начала, ссылки на предыдущие введение и статью.
Спасибо всем, кто с интересом отреагировал и отдельно тем, кто делился мыслями. Вы мне очень помогли с подходом к цифровой подписи. Итак, что изменилось по крупному:
- Появился механизм гибкого расширения протокола: Tagged Tail Records, TTRs
- На его базе сделана схема цифровой подписи пакетов
- Сделан механизм дистанционной конфигурации компонент
- Поднят полный цикл CI: сборка, юнит-тесты, сквозные тесты протокола (4*4 языка программирования)
- Реализация на Си теперь поддерживает разные архитектуры и умеет интегрироваться с разными ОС и мониторами.
- Есть публичные пакеты для Питона и Луа, хотя, конечно, они уже устарели.
Ну и многое по мелочи: интеграция с OpenHAB, конфиг-файлы и логгинг, проверка совместимости с облачным MQTT сервисом, сделан тестовый пример для Wemos D1 (NodeMCU), сделан тестовый пример для atmega128+ethernet (не ардуино), сделан пример протокольного коннектора на Яве (CCU825), сделан пример информера-контроллера в desktop tray (наконец-то я могу включать свет в комнате в два клика мышки:), и ещё разное.
Теперь по порядку.
Читать полностью »
Прерывания от внешних устройств в системе x86. Часть 3. Настройка роутинга прерываний в чипсете на примере coreboot
2019-02-14 в 12:48, admin, рубрики: apic, C, coreboot, interrupts, irq, open source, PCI, pic, системное программированиеПродолжаем рассматривать настройку прерываний от внешних устройств в системе x86.
В части 1 (Эволюция контроллеров прерываний) мы рассмотрели теоретические основы контроллеров прерываний и общие термины, в части 2 (Опции загрузки ядра Linux) посмотрели как на практике ОС осуществляет выбор между контроллерами. В этой части мы рассмотрим как BIOS настраивает роутинг IRQ на контроллеры прерываний в чипсете.
Никакие современные компании по разработке BIOS (AwardBIOS/AMIBIOS/Insyde) не раскрывают исходники своих программ. Но к счастью есть Coreboot — проект по замене проприетарного BIOS на свободное программное обеспечение. В его коде мы и посмотрим, как настраивается роутинг прерываний в чипсете.

io_submit: альтернатива epoll, о которой вы никогда не слышали
2019-02-13 в 13:01, admin, рубрики: AIO, api, async, C, CloudFlare, epoll, io_submit, linux, Блог компании Badoo, высокая производительность, Разработка под Linux, системное программирование
Недавно внимание автора привлекла статья на LWN о новом интерфейсе ядра для опроса (polling). В ней обсуждается новый механизм опроса в Linux AIO API (интерфейс для асинхронной работы с файлами), который добавили в ядро версии 4.18. Идея довольно интересная: автор патча предлагает использовать Linux AIO API для работы с сетью.
Но постойте! Ведь Linux AIO был создан для работы с асинхронным вводом-выводом с диска / на диск! Файлы на диске — это не то же самое, что сетевые соединения. Возможно ли вообще использовать Linux AIO API для работы с сетью?
Оказывается, да, возможно! В этой статье объясняется, как использовать сильные стороны Linux AIO API для создания более быстрых и лучших сетевых серверов.
Но давайте начнём с разъяснения, что представляет собой Linux AIO.
Читать полностью »
Making Git for Windows work in ReactOS
2019-02-08 в 15:56, admin, рубрики: C, control version systems, Git, open source, programming, reactos, self-building, self-compiling, self-hosted, Блог компании Фонд ReactOS, разработка под windows, реверс-инжиниринг, системное программированиеGood day to you! 
My name is Stanislav and I like to write code. This is my first english article on Habr which I made due to several reasons:
- Habr is now in English
- Lack of technical articles in the ReactOS hub
- Recent return of Geektimes to Habr
- Possibility of building ReactOS in ReactOS
- Quite interesting case of fixing the problem in ReactOS in which I was directly involved
This article is an english version of my very first article on russian.
Let me introduce the main figures in this story who actually fixed the bug preventing Git from running in ReactOS — the French developer Hermès Bélusca-Maïto (or just Hermes with hbelusca nickname) and of course me (with x86corez nickname).
The story begins with the following messages from the ReactOS Development IRC channel:
Jun 03 18:52:56 <hbelusca> Anybody want to work on some small problem? If so, can someone figure out why this problem https://jira.reactos.org/browse/CORE-12931 happens on ReactOS? :D
Jun 03 18:53:13 <hbelusca> That would help having a good ROS self-hosting system with git support.
Jun 03 18:53:34 <hbelusca> (the git assertion part only).
Неопределённое поведение и правда не определено
2019-02-08 в 9:23, admin, рубрики: C, c++, undefined behavior, Блог компании PVS-Studio, неопределённое поведение, СиТермином «неопределённое поведение» в языке C и C++ обозначают ситуацию, в которой буквально «чего только не бывает». Исторически, к неопределённому поведению относили случаи, когда прежние компиляторы для C (и архитектуры на нём) вели себя несовместимым образом, и комитет по разработке стандарта, в своей безграничной мудрости, решил ничего не решать по этому поводу (т.е. не отдавать предпочтение какой-то одной из конкурирующих реализаций). Неопределённым поведением также называли возможные ситуации, в которых стандарт, обычно столь исчерпывающий, не предписывал никакого конкретного поведения. У этого термина есть и третье значение, которое в наше время становится всё более актуальным: неопределённое поведение — это возможности для оптимизации. А разработчики на C и C++ обожают оптимизации; они настойчиво требуют, чтобы компиляторы прикладывали все усилия для ускорения работы кода.
Данная статья была впервые опубликована на сайте Cryptography Services. Перевод публикуется с разрешения автора Томаса Порнина (Thomas Pornin).
Читать полностью »
Для тех, кто хочет поиграть в детектива: найди ошибку в функции из Midnight Commander
2019-02-07 в 12:41, admin, рубрики: bugs, C, macros, midnight commander, open source, programming, pvs-studio, static code analysis, static code analyzer, Блог компании PVS-Studio, детектив, макросы, найди ошибку, ошибки, Разработка под Linux, статический анализ кода
Приглашаем попробовать найти ошибку в очень простой функции из проекта GNU Midnight Commander. Зачем? Просто так. Это забавно и интересно. Хотя нет, мы соврали. Мы в очередной раз хотим продемонстрировать ошибку, которую с трудом находит человек в процессе code review, но легко находит статический анализатор кода PVS-Studio.
Читать полностью »
Wanna Play a Detective? Find the Bug in a Function from Midnight Commander
2019-02-07 в 12:35, admin, рубрики: bugs, C, macros, midnight commander, open source, programming, pvs-studio, static code analysis, static code analyzer, Блог компании PVS-Studio, Разработка под Linux
In this article, we invite you to try to find a bug in a very simple function from the GNU Midnight Commander project. Why? For no particular reason. Just for fun. Well, okay, it's a lie. We actually wanted to show you yet another bug that a human reviewer has a hard time finding and the static code analyzer PVS-Studio can catch without effort.
Читать полностью »
