• Ускоряем неускоряемое или знакомимся с 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+ раз.
        Читать дальше →
      • Must-have плагины и несколько полезностей для С\С++ разработки в VS Code



          Удивительно, но до сих пор на Хабре нет хорошей подборки плагинов для Visual Studio Code для тех, кто пишет на С/С++. Microsoft в своем блоге опубликовали только статью, совсем базового уровня с инструкцией по настройке. Но большинство читателей Хабра, тем более из разработчиков, обойдется без такой подробной инструкции. Есть только несколько подборок для веб-разработчиков, но не для С++.

          Наверное это связано с тем, что большинство С++ разработчиков использует тяжеловесные IDE, в первую очередь конечно же Visual Studio.

          Но в Linux и MacOS с полноценными IDE всё не так просто, да и тяжелая среда разработки не всегда нужна или просто не хочется ее использовать.

          Я же хочу обратить ваше внимание на полезные плагины, которые облегчают жизнь и работу, а также рассказать про полезные настройки и особенности VS Code, которые вы могли просто упустить.
          Читать дальше →
        • Интервалы: грядущая эволюция C++

          Уже скоро появится стандарт C++20, в который, скорее всего, добавят концепцию интервалов (ranges), однако мало кто знает, что они из себя представляют и с чем их едят. Доступных широкой аудитории русскоязычных источников про этого зверя мне найти не удалось, вследствие чего в данной статье я бы хотел подробнее про него рассказать, базируясь на лекции Arno Schödl «From Iterators to Ranges: The Upcoming Evolution Of the STL» с конференции Meeting C++ 2015-го года. Я постараюсь сделать эту статью максимально понятной для тех, кто впервые сталкивается с этим понятием, и одновременно расскажу про всевозможные фишки вроде интервальных адаптеров для тех, кто с этим понятием уже знаком и хочет узнать больше.

          Библиотеки с ranges


          На момент написания данной статьи можно выделить три основные библиотеки, реализующие интервалы:


          Первая библиотека, по сути, прародитель данной концепции (что неудивительно, ведь чего только нет в собрании библиотек Boost :) ). Вторая — библиотека Эрика Ниблера (Eric Niebler), про неё будет рассказано позднее. И наконец, последняя библиотека, как нетрудно догадаться, написана компанией think-cell, которая, можно сказать, развила и усовершенствовала Boost.Range.
          Читать дальше →
        • Пример простой нейросети на С/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 файлов.
          Читать дальше →
        • Введение в программирование: простой 3D-шутер с нуля за выходные, часть 2

          • Tutorial
          Продолжаем разговор про 3Д шутер за выходные. Если что, то напоминаю, что это вторая половина:


          Как я и говорил, я всеми силами поддерживаю желание в студентах делать что-то своими руками. В частности, когда я читаю курс лекций по введению в программирование, то в качестве практических занятий я оставляю им практически полную свободу. Ограничений только два: язык программирования (С++) и тема проекта, это должна быть видеоигра. Вот пример одной из сотен игр, которые сделали мои студенты-первокурсники:


          К сожалению, большинство студентов выбирает простые игры типа 2Д платформеров. Я пишу эту статью для того, чтобы показать, что создание иллюзии трёхмерного мира ничуть не сложнее клонирования марио броз.
          Читать дальше →
        • Введение в программирование: простой 3D-шутер с нуля за выходные, часть 1

          • Tutorial
          Этот текст предназначен для тех, кто только осваивает программирование. Основная идея в том, чтобы показать этап за этапом, как можно самостоятельно сделать игру à la Wolfenstein 3D. Внимание, я совершенно не собираюсь соревноваться с Кармаком, он гений и его код прекрасен. Я же целюсь совсем в другое место: я использую огромную вычислительную мощность современных компьютеров для того, чтобы студенты могли создавать забавные проекты за несколько дней, не погрязая в дебрях оптимизации. Я специально пишу медленный код, так как он существенно короче и просто понятнее. Кармак пишет 0x5f3759df, я же пишу 1/sqrt(x). Мы преследуем разные цели.

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

          Простыня получилась длинная, поэтому я разбил текст на две части:


          Выполнение кода из моего репозитория выглядит вот так:


          Это не законченная игра, но только заготовка для студентов. Пример законченной игры, написанной двумя первокурсниками, смотрите во второй части.
          Читать дальше →
        • Интеграция React Native и C++ для iOS и Android

          Недавно мне предложили поработать над одним интересным проектом. Требовалось разработать мобильное приложение для американского стартапа на платформах iOS и Android с помощью React Native. Ключевой технической особенностью и фактором, который однозначно решил мое участие в проекте, стала задача интегрировать библиотеку, написанную на языке С++. Для меня это могло быть новым опытом и новым профессиональным испытанием.

          Почему было необходимо интегрировать С++ библиотеку


          Данное приложение было необходимо для двухфакторной аутентификации с помощью протоколов FIDO UAF и U2F, использующих биометрические данные, таких как Face ID и Touch ID, и аналогичных технологий для Android платформы. Клиент для аутентификации был уже готов. Это была библиотека, написанная на С++ и применяемая некоторыми другими клиентами помимо мобильного приложения. Так что от меня требовалось встроить ее аналогичным образом в мобильное приложение на React Native.
          Читать дальше →
          • +18
          • 2,8k
          • 2
        • Неопределённое поведение и правда не определено

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

          Данная статья была впервые опубликована на сайте Cryptography Services. Перевод публикуется с разрешения автора Томаса Порнина (Thomas Pornin).
          Читать дальше →
        • Если проект «Театр», используй акторов…

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

            Заглянуть за кулисы...

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