Рубрика «Параллелизм»

Mutex, CAS, акторы, STM, CRDT, иммутабельность, MVCC, Disruptor…

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

На самом деле их ровно три. Всё остальное — реализации и комбинации.

Эта статья — попытка навести порядок в голове. После неё вы сможете:

  • за 5 секунд классифицировать любой подход к конкурентности;

  • понимать, почему Erlang выбрал акторы, а Java предлагает synchronized;

  • не изобретать велосипеды и не зацикливаться на «единственно правильном» решении;

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

    Читать полностью »

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

  • для чего нужен тактовый генератор, регистры, кэши и виртуальная память

  • что такое архитектура процессора

  • что такое машинный код и код ассемблера

  • чем отличается компиляция в машинный код в C, C++ или Rust от компиляции в байт-код виртуальной машины в языках типа Java и C#; в чём их отличие от интерпретируемых языков вроде JavaScript или Python

  • что такое динамические и статические библиотеки (.dll/.so, .lib/.a); что такое фреймворк

  • что такое API и web-API

  • Читать полностью »

Efficient Computer — стартап из Питтсбурга, основанный в 2022 году командой исследователей из Университета Карнеги-Меллона. Между прочим, именно Университет Карнеги-Меллона является основным поставщиком кадров в MicrosoftResearch.

Efficient Computer разрабатывает принципиально новую не Фон-Неймановскую архитектуру процессоров и программную экосистему.

Читать полностью »

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

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

Читать полностью »

Наверное, я очень опоздал с изучением CUDA. До недавнего времени даже не знал, что CUDA — это просто C++ с небольшими добавками. Если бы я знал, что изучение её пойдёт как по маслу, я бы столько не медлил. Но если у вас есть багаж привычек C++ , то код на CUDA у вас будет получаться низкокачественным. Поэтому расскажу вам о некоторых уроках, изученных на практике — возможно, мой опыт поможет вам ускорить код.

Слияние блоков памяти

Если у вас множество потоков, работающих над одним массивом в C++, то, вероятно, вы попробуете перебрать его таким образом:

Читать полностью »

В своей предыдущей статье[1] я уже рассказывал, как начал свое знакомство с искусственным интеллектом (ИИ). Тогда это был ChatGPT, а теперь — китайский DeepSeek[2].

Общение с DeepSeek происходит без посредников, что делает его более удобным и доступным. Раньше за использование ChatGPT приходилось платить или, например,  задавать не более трёх вопросов в сутки. А с DeepSeek можно спрашивать сколько угодно и о чём угодно, не тратя ни копейки. Правда, есть опасения, что бесплатная подписка может закончиться, и тогда доступ к сервису будет закрыт. Также ходят слухи о возможных проблемах с «нежелательными» запросами.

Читать полностью »

Как правильно тестировать конкурентные структуры данных - 1


Есть потрясающая библиотека Rust под названием loom, которую можно использовать для тщательного тестирования неблокируемых (lock-free) структур данных. Я давно хотел разобраться, как она работает. И сейчас хочу! Но недавно я случайно реализовал небольшой эксперимент, который, как мне кажется, содержит часть идей loom, поэтому о нём стоит написать. Моя цель — не научить вас тому, что нужно использовать на практике (если вы хотите этого, то почитайте документацию loom), а, скорее, вывести пару идей из фундаментальных принципов.Читать полностью »

За последние несколько лет я видел много дискуссий о функциях Kotlin. Среди обсуждаемых тем обнуляемость всегда в первых рядах. Мне она нравится, но это определенно не моя любимая функция.

Больше всего в Kotlin мне нравятся некоторые мелкие особенности, благодаря которым язык становится очень элегантным. Например, смарт-кастинг (контракты), приостановка, функции приемника/расширения и делегирование.

Но на данный момент моей любимой особенностью является сочетание функций inline и suspend.Читать полностью »

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

Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js