Обновить
12.33

Параллельное программирование *

Распараллеливаем вычисления

Сначала показывать
Порог рейтинга
Уровень сложности

Управление очередями в Laravel

Время на прочтение4 мин
Охват и читатели19K
image

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

Чтобы из одного процесса создать задачу для следующей стадии обработки, мы просто вызывали в конце обработки dispatch(), примерно так:
Читать дальше →

HoleyBeep: объяснение и эксплоит

Время на прочтение6 мин
Охват и читатели7K


В былые времена люди использовали \a для генерирования неприятных «гудков» из спикеров системных блоков. Это было особенно неудобно, если хотелось генерировать более сложные звуковые последовательности вроде 8-битной музыки. Поэтому Джонатан Найтингейл написал программу beep. Это была коротенькая и очень простая программа, позволявшая тонко настраивать звучание из спикера.

С появлением X-сервера всё стало куда сложнее.

Чтобы beep могла работать, пользователь должен был либо быть суперпользователем, либо являться владельцем текущего tty. То есть beep всегда будет работать у root-пользователя или у любого локального, но не будет работать у не-root удалённого пользователя. При этом любой терминал (например, xterm), подключённый к X-серверу, считается «удалённым», и поэтому beep работать не будет.
Читать дальше →

Go: Хороший, плохой, злой

Время на прочтение26 мин
Охват и читатели66K

У Go есть некоторые замечательные свойства, которым посвящён раздел «Хороший». Но когда речь заходит о применении этого языка не для создания API или сетевых серверов (для чего он и был разработан), а для реализации бизнес-логики, то я считаю Gо слишком неуклюжим и неудобным. Хотя даже в рамках сетевого программирования найдётся немало подводных камней как в архитектуре языка, так и в реализации, что делает Go опасным, несмотря на его кажущуюся простоту.

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

Руководство по фоновой работе в Android. Часть 4: RxJava

Время на прочтение5 мин
Охват и читатели13K

Обработка событий — это цикл.

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

Дисклеймер: это не статья о том, как использовать RxJava в Android. Таких текстов в интернете и так прорва. Этот — о деталях реализации библиотеки.
Читать дальше →

Разбор основных концепций параллелизма

Время на прочтение17 мин
Охват и читатели86K
Всем кофе!

Завтра у нас плавненько стартует практически юбилейный поток курс «Разработчик Java» — уже шестой по счёту начиная с апреля прошлого года. А это значит, что мы снова подобрали, перевели интереснейший материал, которым делимся с вами.

Поехали!

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

РАЗДЕЛ 1

Вступление

С момента своего создания Java поддерживает ключевые концепции параллелизма, такие как потоки и блокировки. Эта памятка поможет Java-разработчикам, работающим с многопоточными программами, понять основные концепции параллелизма и способы их применения.

РАЗДЕЛ 2

Концепции

Концепция Описание
Atomicity (атомарность) Атомарная операция — это операция, которая выполняется полностью или не выполняется совсем, частичное выполнение невозможно.
Visibility (видимость) Условия, при которых один поток видит изменения, сделанные другим потоком

Таблица 1: Концепции параллелизма

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

Достижимость нижней границы времени исполнения коммита распределенных отказоустойчивых транзакций

Время на прочтение12 мин
Охват и читатели9.2K

Предисловие


Недавно прочитал очередную статью из серии: "мы лучше двухфазного коммита". Здесь я не буду анализировать содержания этой статьи (хотя, подумываю о том, чтобы дать развернутый анализ). Задача моего опуса — предложить самый эффективный вариант распределенного коммита с точки зрения временных задержек. Конечно, такой коммит дается высокой ценой. Однако цель — дать оценку и показать, что двухфазный коммит не является тормозным, как многие считают.


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

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

Многопоточность на корабликах

Время на прочтение8 мин
Охват и читатели71K

Задача производитель/потребитель


Статья рассчитана для новичков, которые недавно начали свое знакомство с миром многопоточноcти на JAVA.
Читать дальше →

Software Transactional Memory на Free-монадах

Время на прочтение13 мин
Охват и читатели8.2K
Осознав, что я давно не писал на Хабр ничего полезного о ФП и Haskell, и что имеется вполне отличный повод для технической статьи, — решил тряхнуть стариной. Речь в статье пойдет о Software Trasactional Memory (STM), которую мне удалось реализовать на Free-монадах при участии ADTs (Algebraic Data Types) и MVars (конкурентные мутабельные переменные). И, в общем-то, Proof of Concept оказался крайне простым, в сравнении с «настоящим» STM. Давайте это обсудим.

Software Transactional Memory

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

Изучаем параллельные вычисления с OpenMPI и суперкомпьютером на примере взлома соседского WiFi

Время на прочтение11 мин
Охват и читатели20K

Во время написания диссертации одним из направлением исследований было распараллеливание поиска в пространстве состояний на вычислительных кластерах. У меня был доступ к вычислительному кластеру, но не было практики в программировании для кластеров (или HPC — High Performance Computing). Поэтому прежде чем переходить к боевой задаче, я хотел поупражняться на чем-то простом. Но я не любитель абстрактных hello world без реальных практических задач, поэтому такая задача быстро нашлась.



Всем известно, что полный перебор является самым низкоэффективным способом подбора паролей. Однако с появлением суперкомпьютеров появилась возможность существенно ускорить данный процесс, поскольку, как правило, перебор параллелится практически без накладных расходов. Поэтому, теоретически, на кластере можно ускорить процесс с линейным коэффициентом, т.е. имея 100 ядер — ускорить процесс в 1000*k раз (где 0.0 < k <= 1.0). Так ли это на практике?

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

Эффективное использование памяти при параллельных операциях ввода-вывода в Python

Время на прочтение3 мин
Охват и читатели9.7K
Существует два класса задач где нам может потребоваться параллельная обработка: операции ввода-вывода и задачи активно использующие ЦП, такие как обработка изображений. Python позволяет реализовать несколько подходов к параллельной обработке данных. Рассмотрим их применительно к операциям ввода-вывода.

До версии Python 3.5 было два способа реализации параллельной обработки операций ввода-вывода. Нативный метод — использование многопоточности, другой вариант — библиотеки типа Gevent, которые распараллеливают задачи в виде микро-потоков. Python 3.5 предоставил встроенную поддержку параллелизма с помощью asyncio. Мне было любопытно посмотреть, как каждый из них будет работать с точки зрения памяти. Результаты ниже.
Читать дальше →

Java и Project Reactor

Время на прочтение13 мин
Охват и читатели75K


Всем привет! Меня зовут Лёха, и я работаю бэкенд-разработчиком в FunCorp. Сегодня мы поговорим про реактивное программирование, библиотеку Reactor и немного про веб.


Реактивное программирование часто «подвергается упоминанию», но если вы (как и автор статьи) всё ещё не знаете, что это такое — устраивайтесь поудобнее, попробуем разобраться вместе.

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

Задача про forEach(ps::println) от СКБ Контур

Время на прочтение9 мин
Охват и читатели16K

На конференции JBreak я не читал задачки спонсоров специально. Ну, конечно, кроме ада от Excelsior: уж эти ребята всем задали жару. А тут принесли мне листок от СКБ Контур, смотри, мол, посмейся. Я посмеялся: первая задача действительно выглядела настолько наивно сформированной и недоопределённой, что даже не хотелось идти к стенду и убеждать в этом сотрудников компании. Я про это почти забыл, однако тут на Хабре появился авторский разбор этой задачи, не лишённый некоторой глубины. Даже про modCount написали. Выходит, зря я смеялся?

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

Интересные сюрпризы ConcurrentDictionary (+разбор задачи с DotNext 2017 Moscow)

Время на прочтение5 мин
Охват и читатели37K

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


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


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

Ближайшие события

Книга «Реактивные шаблоны проектирования»

Время на прочтение6 мин
Охват и читатели15K
image Эта книга задумывалась как исчерпывающее руководство по реактивным системам, которое поможет понимать и проектировать их. Поэтому в ней обсуждаются не только сам манифест реактивного программирования, но и причины, которые привели к его появлению. Основная часть книги представляет собой собрание шаблонов проектирования, которые олицетворяют множество аспектов реактивной архитектуры. При этом даются отсылки на углубленный материал для дальнейшего изучения. И хотя представленные шаблоны составляют единое целое, их перечень не полон — он и не может быт быть таковым. Однако общие сведения, содержащиеся в книге, позволят читателю определять, вычленять и развивать новые шаблоны, если это потребуется.
Читать дальше →

Что такое Tokio и Async I/O и зачем это нужно?

Время на прочтение10 мин
Охват и читатели23K

Сообщество Rust в последнее время сконцентрировало много своих усилий на асинхронном вводе/выводе, реализованном в виде библиотеки Tokio. И это замечательно.


Многим из участников сообщества, тем, которые не работали с веб-серверами и связанными с этим вещами, не ясно, чего же мы хотим добиться. Когда эти вещи обсуждались во времена версии 1.0, я тоже имел смутное представление об этом, никогда прежде не работав с этим раньше.


  • Что это такое — Async I/O?
  • Что такое корутины (coroutines)?
  • Что такое легковесные нити (threads)?
  • Что такое футуры? (futures)?
  • Как они сочетаются между собой?

Рассмотрим модели многопоточности на примере Rust и Go.

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

Python для обучения научной информатике: Моделирование систем массового обслуживания

Время на прочтение27 мин
Охват и читатели36K

Аннотация


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

Parallel STL. Быстрый способ ускорить C++ STL код

Время на прочтение10 мин
Охват и читатели32K
За пару последних десятилетий, пока вычислительные системы эволюционировали от одноядерных скалярных до многоядерных векторных архитектур, значительно выросла популярность управляемых языков, а также появились новые языки программирования. Но старый добрый C++, позволяющий писать высокопроизводительный код, остается более чем популярным. Однако, до недавнего времени стандарт языка не предоставлял каких-либо инструментов для выражения параллелизма. Новая версия стандарта (C++17 [1]) предоставляет набор параллельных алгоритмов Parallel STL, дающий возможность преобразовать существующий последовательный C++ код в параллельный, что, в свою очередь, позволяет задействовать такие аппаратные возможности, как многопоточность и векторизация. Эта статья познакомит вас с основами Parallel STL и его реализацией в Intel Parallel Studio XE 2018.


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

Сказ о тотальном переборе, или Томительное ожидание декрипта

Время на прочтение13 мин
Охват и читатели14K
imageПриветствую жителей Хабра!

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

Го под кат, печеньки out there!
Читать дальше →

Что ещё необходимо узнать про OpenCL C перед тем, как на нём писать

Время на прочтение13 мин
Охват и читатели18K
Как было написано
float4 val = (0, 0, 0, 0);

Что хотел написать автор
float4 val = (float4)(0, 0, 0, 0);

Как нужно было написать
float4 val = 0;


Если Вы сталкивались с OpenCL или планируете столкнуться и не видите разницы между первым и вторым вариантом, а третий вызывает у Вас сомнения — «А скомпилируется ли вообще?» — добро пожаловать под кат, там много нюансов языка и совсем ничего про API и оптимизацию производительности.
Читать дальше →

Физическое моделирование на GPU с использованием compute shader в среде Unity3D

Время на прочтение17 мин
Охват и читатели42K
В этом руководстве я расскажу, как использовать compute shader для реализации вычислений на видеокарте — на примере модели волос: