• Ускоряем неускоряемое или знакомимся с SIMD, часть 2 — AVX

      Предыдущая часть вызвала бурную дискуссию, в ходе которой выяснилось, что AVX/AVX2 на самом деле есть в десктопных CPU, нет только AVX512. Поэтому продолжаем знакомиться с SIMD, но уже с современной его частью — AVX. А так же разберём некоторые комментарии:


      • медленнее ли _mm256_load_si256, чем прямое обращение к памяти?
      • влияет ли на скорость использование AVX команд над SSE регистрами?
      • действительно ли так плохо использовать _popcnt?
      Читать дальше →
    • Ускоряем неускоряемое или знакомимся с SIMD

        Есть класс задач, которые нельзя ускорить за счёт оптимизации алгоритмов, а ускорить надо. В этой практически тупиковой ситуации к нам на помощь приходят разработчики процессоров, которые сделали команды, позволяющие выполнять операции на большим количеством данных за одну операцию. В случае 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, предвесенние итоги: дистанционная конфигурация и цифровая подпись

          Зима кончается, и это повод подвести очередную черту и рассказать, что нового появилось в MQTT/UDP.

          Для начала, ссылки на предыдущие введение и статью.

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

          • Появился механизм гибкого расширения протокола: Tagged Tail Records, TTRs
          • На его базе сделана схема цифровой подписи пакетов
          • Сделан механизм дистанционной конфигурации компонент
          • Поднят полный цикл CI: сборка, юнит-тесты, сквозные тесты протокола (4*4 языка программирования)
          • Реализация на Си теперь поддерживает разные архитектуры и умеет интегрироваться с разными ОС и мониторами.
          • Есть публичные пакеты для Питона и Луа, хотя, конечно, они уже устарели.

          Ну и многое по мелочи: интеграция с OpenHAB, конфиг-файлы и логгинг, проверка совместимости с облачным MQTT сервисом, сделан тестовый пример для Wemos D1 (NodeMCU), сделан тестовый пример для atmega128+ethernet (не ардуино), сделан пример протокольного коннектора на Яве (CCU825), сделан пример информера-контроллера в desktop tray (наконец-то я могу включать свет в комнате в два клика мышки:), и ещё разное.

          Теперь по порядку.
          Читать дальше →
          • +19
          • 3,1k
          • 2
        • Прерывания от внешних устройств в системе x86. Часть 3. Настройка роутинга прерываний в чипсете на примере coreboot

          • Tutorial
          Продолжаем рассматривать настройку прерываний от внешних устройств в системе x86.
          В части 1 (Эволюция контроллеров прерываний) мы рассмотрели теоретические основы контроллеров прерываний и общие термины, в части 2 (Опции загрузки ядра Linux) посмотрели как на практике ОС осуществляет выбор между контроллерами. В этой части мы рассмотрим как BIOS настраивает роутинг IRQ на контроллеры прерываний в чипсете.

          Никакие современные компании по разработке BIOS (AwardBIOS/AMIBIOS/Insyde) не раскрывают исходники своих программ. Но к счастью есть Coreboot — проект по замене проприетарного BIOS на свободное программное обеспечение. В его коде мы и посмотрим, как настраивается роутинг прерываний в чипсете.



          Читать дальше →
          • +36
          • 2,9k
          • 3
        • io_submit: альтернатива epoll, о которой вы никогда не слышали

          • Перевод


          Недавно внимание автора привлекла статья на LWN о новом интерфейсе ядра для опроса (polling). В ней обсуждается новый механизм опроса в Linux AIO API (интерфейс для асинхронной работы с файлами), который добавили в ядро версии 4.18. Идея довольно интересная: автор патча предлагает использовать Linux AIO API для работы с сетью.

          Но постойте! Ведь Linux AIO был создан для работы с асинхронным вводом-выводом с диска / на диск! Файлы на диске — это не то же самое, что сетевые соединения. Возможно ли вообще использовать Linux AIO API для работы с сетью?

          Оказывается, да, возможно! В этой статье объясняется, как использовать сильные стороны Linux AIO API для создания более быстрых и лучших сетевых серверов.

          Но давайте начнём с разъяснения, что представляет собой Linux AIO.
          Читать дальше →
        • Пример простой нейросети на С/C++

          Всем привет.

          Решил поделиться простым и ёмким на мой взгляд решением нейронной сети на С++.

          Почему эта информация должна быть интересна?

          Ответ: я старался в минимальном наборе запрограммировать работу многослойного перцептрона, да так, чтобы его можно было настраивать как душе угодно всего в нескольких строчках кода, а реализация основных алгоритмов работы на «С» позволит с лёгкостью переносить на «С» ориентированные языки(в прочем и на любые другие) без использования сторонних библиотек!

          Прошу взглянуть на то, что из этого вышло


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

          Исходный код вы найдёте в конце статьи, а пока по порядку.

          Начнём разбор


          1) Архитектура и технические подробности


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

          пример конфигурации
          myNeuero.cpp

              inputNeurons = 100; 	//ширина входного слоя
              outputNeurons =2;    	//ширина выходного слоя
              nlCount = 4;			//количество слоёв ( по факту их 3, указываемое число намеренно увеличено на 1
              list = (nnLay*) malloc((nlCount)*sizeof(nnLay));
          
              inputs = (float*) malloc((inputNeurons)*sizeof(float));
              targets = (float*) malloc((outputNeurons)*sizeof(float));
          
              list[0].setIO(100,20);  //установка ширины INPUTS/OUTPUTS для каждого слоя
              list[1].setIO(20,6);	//  -//-
              list[2].setIO(6,3);     //  -//-
              list[3].setIO(3,2);     //  -//- выходной слой
          


          Обратите внимание, что установка ширины входа и выхода для каждого слоя выполняется по определённому правилу — вход текущего слоя = выходу предыдущего. Исключением является входной слой.

          Таким образом, вы имеете возможность настраивать любую конфигурацию вручную или по заданному правилу перед компиляцией или после компиляции считывать данные из source файлов.
          Читать дальше →
        • Неопределённое поведение и правда не определено

          • Перевод
          Термином «неопределённое поведение» в языке C и C++ обозначают ситуацию, в которой буквально «чего только не бывает». Исторически, к неопределённому поведению относили случаи, когда прежние компиляторы для C (и архитектуры на нём) вели себя несовместимым образом, и комитет по разработке стандарта, в своей безграничной мудрости, решил ничего не решать по этому поводу (т.е. не отдавать предпочтение какой-то одной из конкурирующих реализаций). Неопределённым поведением также называли возможные ситуации, в которых стандарт, обычно столь исчерпывающий, не предписывал никакого конкретного поведения. У этого термина есть и третье значение, которое в наше время становится всё более актуальным: неопределённое поведение — это возможности для оптимизации. А разработчики на C и C++ обожают оптимизации; они настойчиво требуют, чтобы компиляторы прикладывали все усилия для ускорения работы кода.

          Данная статья была впервые опубликована на сайте Cryptography Services. Перевод публикуется с разрешения автора Томаса Порнина (Thomas Pornin).
          Читать дальше →
        • Для тех, кто хочет поиграть в детектива: найди ошибку в функции из Midnight Commander

            Найди ошибку!


            Приглашаем попробовать найти ошибку в очень простой функции из проекта GNU Midnight Commander. Зачем? Просто так. Это забавно и интересно. Хотя нет, мы соврали. Мы в очередной раз хотим продемонстрировать ошибку, которую с трудом находит человек в процессе code review, но легко находит статический анализатор кода PVS-Studio.
            Читать дальше →
          • Расширение макроса assert() для реализации минимальной обработки ошибок

              – Сир, я придумал защиту от дракона. Он нам больше не страшен! Она срабатывает от взмахов крыльев дракона и включает громкую сирену, так чтобы все слышали, что приближается дракон.
              – Что-нибудь ещё эта защита делает?
              – Нет, зачем? Мы будем предупреждены!
              – Да… Съедены под вой сирены… И ещё… напомни, когда у нас плановые отключения электричества?…

              Описание проблемы


              Данный способ не претендует на концепцию обработки ошибок в комплексных и сложных проектах. Скорее это пример того, что можно сделать минимальными средствами.
              Читать дальше →
            • Open source: кодоюмор, кодотрюки, НЕ кодобред

                Старый GLib vs новый Clang


                Ковыряясь в разнообразном СПО, я периодически нахожу всякие интересные штуки: иногда это просто смешной комментарий, иногда — нечто остроумное в более широком смысле. Подобные подборки периодически появляются и в «глобальном Интернете», и на Хабре — есть, скажем, широко известный вопрос на StackOverflow про комментарии в коде, а здесь недавно публиковалась подборка забавных названий юрлиц и топонимов. Попробую и я структурировать и выложить то, что постепенно у меня копилось. Под катом вас ждут цитаты из QEMU, ядра Linux, и не только.

                Читать дальше →

              Самое читаемое