Pull to refresh
4
0.1
Сергей @gres_84

C++ Developer

Send message

Алгоритмы быстрого умножения чисел: от столбика до Шенхаге-Штрассена

Level of difficultyMedium
Reading time26 min
Views49K

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

И уж конечно, никогда при написании a * b мы не задумываемся о том, как реализовано умножение чисел a и b в нашем языке. Какие вообще есть алгоритмы умножения? Это какая-то нетривиальная задача?

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

Скорее к формулам!

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

Level of difficultyMedium
Reading time6 min
Views9.8K

В этой статье мы рассмотрим классический конкурентный кольцевой буфер и обсудим, как его можно оптимизировать для повышения производительности. Я покажу вам, как существенно улучшить этот показатель от 5,5 миллионов элементов в секунду до 112 миллионов элементов в секунду — и эти показатели выше, чем в реализациях Boost и Folly. Если вам требуется готовая реализация со всеми этими оптимизациями, посмотрите мою библиотеку SPSCQueue.h.

Кольцевой буфер также называется очередью «один производитель — один потребитель» (SPSC). В ней не бывает ожидания (и, соответственно, не бывает блокировок), это конкурентный примитив. Такая структура данных находит множество вариантов применения, и здесь я рассмотрю передачу сетевых пакетов между сетевым контроллером и драйверами операционной системы. Основная задача, решаемая при этом — выполнение событий ввода/вывода в относительно новом асинхронном API io_uring.

Читать далее

Хитрости для программистов: пять команд Linux, с которыми ваша жизнь не будет прежней

Reading time8 min
Views85K

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

Поначалу Linux многих обескураживает, но как только вы разберётесь с интерфейсом командной строки (CLI), вы поймёте, что это лучший друг программиста. Простые, но эффективные команды Linux могут заметно улучшить любые рабочие процессы — от навигации по каталогам до манипуляции с файлами и даже исправления ошибок.

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

Читать далее

Барьеры и модели памяти – explained

Level of difficultyMedium
Reading time7 min
Views6.1K

Всем привет! 

Начну с предыстории.

Когда мы в Амазоне планировали переносить сервис с x86/64 на ARM, почему-то никто в нашей команде не поднял тему того, что надо уделить особое внимание работе с многопоточностью и синхронизацией, так как из-за того, что у этих двух архитектур разные модели памяти, могли случиться неожиданные проблемы.

Однако, на тот момент я тоже об этом не знал, и нам повезло, что мы изначально везде использовали модель памяти Sequential Consistency (что это – далее в статье), поэтому все прошло гладко. Теперь, зная про модели памяти и возможные последствия, боюсь представить, что было бы в противном случае.

Как родилась статья

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

Статья основана на материалах лекции Computer Science Center (CSC) с курса “Параллельные вычисления” преподавателя Калишенко Е.Л. Крайне рекомендую ознакомиться со всеми лекциями курса (более структурированного материала по теме я еще не встречал). Благо он в открытом доступе – ссылка.

Что такое барьеры памяти и зачем это все нужно?

Начнем с небольшого описания того, как устроена “условная” архитектура процессора. Почему условная? Потому что может отличаться в зависимости от конкретной реализации, но суть похожа. 

Читать далее

Математическая продлёнка. Про НОД, НОК и суперсилу

Level of difficultyEasy
Reading time10 min
Views7.7K

Продолжаю делиться с вами своими заметками для занятий математического кружка. Эта статья носит пятничный характер, и представляет опыт лёгкой болтовни на глубокие математические темы. Именно такие беседы с моим папой, а потом с учителями в новосибирской ФМШ когда-то привели меня в науку, и именно они оставляют у учеников ощущение прикосновения к чему-то большому и стройному, что популярные ныне стоики называли словом Логос.

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

Читать далее

Оптимизация компилятора на пальцах

Reading time15 min
Views5.8K

Почему я это написал, и как читать статью

Недавно получил от друга такое сообщение:

Знаешь, какая статья была бы реально интересна? Если бы в ней было показано, что именно происходит с твоим кодом в результате оптимизаций.

Я сразу же подумал: «Ну конечно, я знаю тысячу статей и видеороликов на эту тему», но вскоре осознал, что практически во всех таких источниках от читателя требуется знать компьютерный жаргон, внутреннее устройство, промежуточные представления, т.д. Вот какая проблема здесь возникает: те, кто пользуется компиляторами (как, например, мой друг), всем этим не заморачиваются. Их не волнует, каково именно промежуточное представление LLVM, или что такое φ-узел, или какой проход и почему называется «ротацией циклов». Нет, их интересуют (в порядке убывания приоритета) ответы на вопросы: (1) что, (2) почему, (3) как.

Читать далее

Как работает погода: циклоны, фронты, снегопады в мае, дожди на Новый год

Level of difficultyEasy
Reading time19 min
Views6.2K

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

А ведь погода — это то что касается каждого из нас, независимо от профессии и образа жизни (не, ну может шахтерам и машинистам метро в их подземельях она не так важна). И наверняка многим из нас приходят в голову философские вопросы: «почему вчера был будний день и +25, а сегодня выходной, всего +15 и дождь». А, ну и еще: «почему по прогнозу ясно, а надо мной льет?!», «где снег на Новый год?», «откуда заморозки в мае?» и тому подобное.

При этом базовые принципы устройства нашей атмосферы довольно просты. Всё упирается в 3–4 основных физических эффекта и пару‑тройку основных понятий. И если их уяснить, то фраза «теплый сектор атлантического циклона на фоне западного переноса» сразу объяснит вам, почему у вас в Питере на Новый год идет дождь вместо снега. А по форме облаков можно будет предсказывать погоду на завтра, не доставая телефон из кармана.

Интересно? Попробуем в этом разобраться!

Читать далее

std::chrono в C++: управляем временем

Level of difficultyEasy
Reading time6 min
Views11K

Привет, Хабр!

Помните, какие времена были? Когда-то мы всерьез возились с time_t и ctime, огребали от структур tm и, если хотели засечь время, то приходилось чудить с difftime() и писать собственный секундомер на костылях. Вспомнить страшно — в голове сразу всплывают унылые алгоритмы перевода секунд в даты и обратно, а при упоминании часовых поясов хочется плакать. Слава небесам, пришел std::chrono! С ним управлять временем в коде можно чуть ли не с шиком: точные интервалы, аккуратные преобразования, поддержка календарей и таймзон — все это теперь под рукой и без изнуряющих плясок с бубном.

В этой статье я расскажу как использовать std::chrono.

Читать далее

Элегантная математика фильтров Блума

Level of difficultyMedium
Reading time7 min
Views15K

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

В этой статье речь пойдёт об изяществе математики, лежащей в основе фильтров Блума. Мы разберём аспекты точности работы и компромиссов при конфигурировании этих фильтров, а также узнаем, почему в некоторых случаях они могут стать отличным выбором, особенно в сфере больших данных и системах OLAP, когда подразумевается обработка огромных и статичных датасетов.
Читать дальше →

Математическая продлёнка. Изобретаем параболические числа

Level of difficultyMedium
Reading time13 min
Views4.3K

Курс начальной школы приучает нас к тому, что числа пригодны для счёта. В средней школе, когда к математике подключаются физика и химия, мы узнаём, что числами можно моделировать всевозможные явления от наполнения бассейнов и движения велосипедистов, до количества тепла, которое выделится, если дать соединиться двум молям водорода и одному молю кислорода. А в старших классах на смену числам приходят функции, векторы и другие замечательные математические объекты, которыми можно моделировать ещё более сложные процессы и явления. Однако, если заглянуть в «большую» математику, обитающую в университетах, а также в статьях и книгах, посвящённых специальным разделам математики, то можно обнаружить что числа, вернее числовые системы: кольца, поля, их расширения и модули над ними, сами по себе оказываются способны на многое. Ими можно моделировать целые пространства, геометрические объекты и их преобразования (комплексные числа, кватернионы, алгебры Клиффорда), регулярные структуры, обладающие пространственной симметрией (числа Гаусса, Эйзенштейна) или преобразования специальной теории относительности (дуальные числа, алгебра пространства-времени).

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

Читать далее

Как работают std::launder и std::as_const в C++

Level of difficultyEasy
Reading time3 min
Views3.4K

Есть в C++ такие штуки, которые вроде как существуют в стандарте, но некоторые о них даже не задумываются, пока не наткнутся на что‑то совсем странное. Вот, например,std::launder. Что это вообще? Стирка чего‑то грязного в коде (launder)? Или std::as_const — зачем делать объект «немного более константным»?

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

Читать далее

Анализируем простейший усилитель

Level of difficultyMedium
Reading time26 min
Views37K
В настоящей статье я хочу рассмотреть и проанализировать широко известную и подкупающую своей простотой минимальную схему усилителя на одном биполярном транзисторе:


Прекрасно осознавая, что в Интернете на данную тему имеется огромное количество статей, тем не менее рискну написать еще одну. Несмотря на кажущуюся простоту, данный усилитель так или иначе затрагивает большое количество различных вопросов и здесь есть что обсудить. Соответственно, разные авторы рассматривают данный усилитель несколько под разными углами. Надеюсь, и моя статья кому-то окажется интересной и полезной.
Читать дальше →

Математическая продлёнка. Изобретаем гиперболические числа

Level of difficultyMedium
Reading time9 min
Views5.3K

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

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

Читать далее

Термодинамика чёрных дыр. Энтропия Бекенштейна-Хокинга, комплементарность Сасскинда и дуальность Малдасены

Level of difficultyMedium
Reading time31 min
Views8.5K

Парадокс уничтожения информации чёрными дырами — ключ к теории квантовой гравитации или надуманная проблема, заведомо не имеющая решения? Как чёрные дыры испаряются и достигают теплового равновесия со средой, ничего не выпуская из‑под горизонта событий? Существует ли предел информационной ёмкости пространства? Может ли наша Вселенная оказаться трёхмерной голографической проекцией некой двумерной поверхности? Если вы не занимаетесь теоретической физикой или философией, поиски ответов на эти вопросы покажутся вам бесполезной тратой вычислительных ресурсов мозга. Но если вы любите парадоксы и хотите понять, как устроен мир на самом фундаментальном уровне — добро пожаловать за горизонт событий, где вступают в противоречие две основополагающие теории современной физики — квантовая теория поля и общая теория относительности.

Читать далее

Математическая продлёнка. Изобретаем эллиптические числа

Level of difficultyMedium
Reading time7 min
Views8.1K

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

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

Читать далее

Математическая продлёнка. Изобретаем числа по-взрослому

Level of difficultyMedium
Reading time16 min
Views6.1K

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

В этой части мы рассмотрим общие принципы построения числовых систем, как модулей над другими системами, перейдём от пар к матрицам и немного пофилософствуем над такими вопросами: «Что такое числовая система?», «Почему матрицы так хорошо подходят для сочинения новых чисел?»

Читать далее

Математическая продлёнка. Изобретаем дроби

Level of difficultyEasy
Reading time10 min
Views6.3K

Это вторая часть серии статей, посвящённой построению числовых систем, основанных на упорядоченных парах. В предыдущей статье мы рассмотрели как строится кольцо целых чисел из пары натуральных, освоившись с понятиями классов эквивалентности и факторизацией. В этой построим ещё одну знакомую числовую систему: поле рациональных чисел.

Как объяснить правила сложения, умножения и сравнения для дробей? Откуда взялись общие знаменатели, деление многоэтажных дробей, всевозможные «методы бабочки» и прочие премудрости, подстерегающие человека классе в шестом?

Материал расчитан на тех, кто учит старшеклассников или младшекурсников

Читать далее

Математическая продлёнка. Изобретаем целые числа

Level of difficultyEasy
Reading time11 min
Views17K

Этой мини-серией статей я хочу объединить свои заметки для математического кружка о различных необычных, но полезных числовых системах, основанных на парах чисел. План знакомства с числовыми системами будет такой:

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

2. Во второй части от целых мы перейдём к рациональным числам, которые тоже можно представить в виде пары — рациональной дроби. Главный вопрос на который мы постараемся ответить: «А чего у дробей всё так сложно-то?»

3. В третьей части мы сконструируем Гауссовы числа и порассуждаем над более общим вопросом: «Что такое число?». В этой части мы перейдём от пар к матричным представлениям чисел, что позволит нам ввести их классификацию.

4. Четвёртая часть будет посвящена эллиптическим арифметикам: комплексным числам и числам Эйзенштейна. Здесь мы порассуждаем над сакраментальным вопросом: «Реальная ли мнимая единица?»

5. В пятой части мы рассмотрим гиперболические арифметики и познакомимся с двойными числами, и немного используем их на практике, чтобы понять «Как работает формула Бине?»

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

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

Читать далее

Делаем опенсорс курс C++ 17+. Присоединяйтесь

Level of difficultyEasy
Reading time9 min
Views14K
Небольшой командой энтузиастов мы уже два года развиваем проект Senior Junior. Это площадка с курсами от программистов для программистов. Из отзывов и разговоров с пользователями мы накопили любопытные наблюдения. Например, какие трюки помогают не бросить обучение на пол-пути и как избавиться от самообмана «ха, я точно понял эту тему».

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


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

Грязные трюки C++ из userver и Boost

Level of difficultyMedium
Reading time15 min
Views18K

Привет, я Антон Полухин из Техплатформы Екома и Райдтеха Яндекса. Моя команда разрабатывает userver — современный опенсорсный асинхронный фреймворк с богатым набором абстракций для быстрого и комфортного создания микросервисов, сервисов и утилит на C++.

Когда мы пишем какой‑то код для userver и для таких сложных проектов, как Boost, периодически мы сталкиваемся с нестандартными проблемами. И эти нестандартные проблемы требуют нестандартных решений. Вот о таких решениях мы сегодня и поговорим.

А именно:

— Посмотрим, как работают исключения на платформе Linux x86, и сделаем с ними что‑то интересное.

— Залезем ещё глубже под капот исключений и сделаем их ещё быстрее.

— Сделаем висячую ссылку на невалидный объект, и всё будет хорошо.

— А под конец то, что все любим, — погрузимся в шаблонное метапрограммирование.

Читать далее

Information

Rating
3,557-th
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity