Как стать автором
Обновить

Многопоточность и Thread Pool в C++

Уровень сложности Простой
Время на прочтение 18 мин
Количество просмотров 3.8K
Программирование *C++ *Процессоры
Из песочницы

Привет, Хабр! Я неожиданно созрел для написания первой статьи тут. За время работы в сфере IT у меня появилась своя собственная библиотека на языке C++, которая медленно, но верно обрастает различными полезными модулями. Не все включаемые в нее модули написаны мною с нуля, но я всегда стараюсь так или иначе адаптировать их под свои нужды. Сегодня у меня появилось непреодолимое желание поделиться с вами некоторыми фрагментами моей библиотеки.

Читать далее
Всего голосов 9: ↑7 и ↓2 +5
Комментарии 6

Параллельные вычисления при поиске простых чисел.

Время на прочтение 2 мин
Количество просмотров 2.4K
Чулан
Небольшая лабораторная работа по распараллеливанию.
На входе лобовой алгоритм поиска простых чисел, на выходе изменение скорости вычислений в зависимости от количества нитей.

если интересно, смотрим дальше
Всего голосов 40: ↑31 и ↓9 +22
Комментарии 55

Бесплатные обеды закончились на практике

Время на прочтение 3 мин
Количество просмотров 14K
Блог компании Intel
Есть достаточно известная статья Герба Саттера "The Free Lunch Is Over. A Fundamental Turn Toward Concurrency in Software". В ней говорится, что не стоит более надеяться на рост тактовой частоты микропроцессоров. Для повышения производительности программ теперь необходимо использовать несколько ядер в микропроцессоре. Хотя статья написана в 2005 году, до настоящего времени она для меня была скорее теоретической, чем практическим руководством к действию. Ранее я всегда получал ускорение, приобретая новый компьютер. Но вот настал тот момент, когда этого не произошло.
image
Рисунок 1 — Время работы unit-тестов на моей старой и новой машине.
Читать дальше →
Всего голосов 59: ↑44 и ↓15 +29
Комментарии 79

Математик vs. Ферзь

Время на прочтение 5 мин
Количество просмотров 2.3K
Чулан
Статья адресована читателям, которые имеют опыт решения задач перечислительной комбинаторики, а также тем, кому нравятся трудные задачи по программированию.

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

Читать дальше →
Всего голосов 39: ↑34 и ↓5 +29
Комментарии 5

CUDA и другая новая начинка для сверхмасштабируемых серверных комплексов

Время на прочтение 2 мин
Количество просмотров 4.6K
Блог компании Hewlett Packard Enterprise
Шасси HP ProLiant SL6500Прошлой осенью HP представила новое семейство своих серверов стандартной архитектуры ProLiant SL6000. Оно было разработано специально для построения сверхмасштабируемых вычислительных комплексов и обеспечивает максимально плотную упаковку процессорной мощности. Это прежде всего достигается за счет использования шасси, в котором размещены общие для всех серверных модулей блоки питания и вентиляторы.

В начале октября вышло уже второе поколение — ProLiant SL6500, имеющее на борту новейшие процессоры Intel Xeon и, опционально, GPU на базе архитектуры nVidia CUDA. На основе опыта использования SL6000 в нем было внедрено несколько изменений. Высота шасси теперь составляет 4U вместо прежних 2U, шасси поддерживает горячую замену серверных модулей (и как опция — блоков питания), а сами серверные модули оборудуются заменяемыми в горячем режиме жесткими дисками. Кроме того, в зависимости от начинки шасси для него можно выбрать блоки питания на 460, 750 и 1200 Вт, что позволяет оптимизировать энергопотребление больших серверных комплексов.
Читать дальше →
Всего голосов 7: ↑6 и ↓1 +5
Комментарии 10

Прогноз погоды своими руками

Время на прочтение 3 мин
Количество просмотров 31K
Высокая производительность *
Каждый из нас ругал синоптиков, когда оказывался под дождем, не имея в руках зонта. В топике я расскажу Вам как сделать прогноз погоды на основе модели WRF (Weather Research & Forecasting Model) на несколько суток вперед.
Читать дальше →
Всего голосов 55: ↑53 и ↓2 +51
Комментарии 43

Ускорение ядра Linux с помощью графического процессора GPU

Время на прочтение 2 мин
Количество просмотров 6.2K
Настройка Linux *
Перевод
Исследования Университета штата Юта, спонсированные частично компанией NVIDIA, направлены на изучение ускорения ядра Linux с использованием ускорения графического процессора GPU. Вместо того чтобы просто позволить приложениям пользователя использовать огромную силу предлагаемых современных графических процессоров, исследователи надеются ускорить части ядра Linux запустив его прямо на GPU.

Из страниц исследования: «Идея проекта KGPU состоит в том, чтобы графический процессор GPU рассматривался в качестве вычислительного сопроцессора для операционной системы, позволяющего производить параллельные вычисления внутри ядра Linux. Это даст возможность использовать SIMD (или SIMT в CUDA) для ускорения функциональности ядра Linux и внести новые функциональные возможности, которые ранее считались слишком интенсивными вычислениями для ядра. Проще говоря, проект KGPU делает возможными векторные вычисления внутри ядра».
Читать дальше →
Всего голосов 78: ↑71 и ↓7 +64
Комментарии 64

Поддержка GPU в математическом пакете MATLAB

Время на прочтение 1 мин
Количество просмотров 14K
Высокая производительность *Matlab *
За последние год-полтора создание кластеров и суперкомпьютеров на GPU стало новым трендом для высокопроизводительных систем. Это вполне имеет смысл, потому что графические процессоры прекрасно поддерживают параллельную работу и на некоторых задачах обладают производительностью гораздо выше, чем у бюджетных CPU.

В этом смысле вполне логичной выглядит новость, что в пакете программ математического моделирования MATLAB версии 2010b появилась нативная поддержка Nvidia CUDA (версия Compute Capability 1.3 или выше). Она включена в набор инструментов Parallel Computing Toolbox. Теперь распараллеливание команд осуществляется прямо из MATLAB и не нужно переписывать код на C++ или Fortran специально для CUDA.
Читать дальше →
Всего голосов 29: ↑26 и ↓3 +23
Комментарии 27

Dataflow-архитектуры. Часть 1

Время на прочтение 6 мин
Количество просмотров 33K
Высокая производительность *

Вторая часть статьи.
Большинство современных вычислительных машин, будь то суперкомпьютер Fujitsu K, обычная персоналка или даже калькулятор, объединяет общий принцип работы, а именно модель вычислений, основанная на потоке управления (Controlflow). Однако, эта модель не является единственно возможной. В некотором роде ее противоположностью является модель вычислений, управляемая потоком данных, или просто Dataflow. О ней я и хочу сейчас рассказать.
Читать дальше →
Всего голосов 78: ↑77 и ↓1 +76
Комментарии 36

Dataflow-архитектуры. Часть 2

Время на прочтение 8 мин
Количество просмотров 10K
Высокая производительность *

В первой части статьи мы рассмотрели основные отличия архитектуры потока данных (dataflow) от архитектуры потока управления (controlflow), совершили экскурсию в 1970-е, когда появились первые аппаратные dataflow-машины и сравнили статическую и динамическую потоковые модели вычислений. Сегодня я продолжу вас знакомить с dataflow-архитектурами. Добро пожаловать под кат!

Читать дальше →
Всего голосов 35: ↑33 и ↓2 +31
Комментарии 15

Распараллеливание тестов или одна голова — хорошо, а две головы — лучше

Время на прочтение 3 мин
Количество просмотров 4.9K
Тестирование IT-систем *
В какой-то момент, если долго и усердно стараться сохранять покрытие тестами не меньше 80% кода, прогон полного комплекта тестов начнет занимать больше времени, чем уходит на перекур и на прочтение новых статей хабра. В свою очередь это приводит к тому, что полный комплект (suite) будет запускаться все реже и реже. Hudson начнет сообщать о сломанных билдах, а дальше сработает эффект разбитого окна и сломанный билд станет нормой.

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

В одном из наших проектов, в который согласно записям redmine вложено около 400 часов работы нашего коллектива ситуация с тестами до распараллеливания выглядела так (пару дней назад):
151 scenarios (151 passed)
3997 steps (3997 passed)
17m49.257s


18 минут!!!

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

Но анализ загрузки процессора при прогоне показывает, что в работе участвует только лишь одно ядро независимо от того, сколько их всего есть. Как говорит пословица, лучше день потерять, а потом за пять минут долететь. Порыскав в гугле мы нашли гем parallel_tests. Теперь мы не с такой завистью будем смотреть на erlang группу, которые могут спокойно распараллелить свои тесты на кластер арендованных облачных машин в Selectel.
Читать дальше →
Всего голосов 38: ↑38 и ↓0 +38
Комментарии 38

Свёртки в Intel Cilk Plus

Время на прочтение 8 мин
Количество просмотров 2.8K
Программирование *Математика *
Допустим нам зачем-то нужно найти сумму элементов массива. Мы можем разбить массив на две части, просуммировать каждую часть отдельно и сложить результаты. При этом суммировать эти части можно параллельно. Но суммирование части массива это в точности исходная задача, и каждую часть снова можно разбить на две части и просуммировать каждую часть отдельно, а затем сложить результаты и т. д. Такая стратегия вычислений называется «разделяй и властвуй».

Таким способом можно вычислять много других функций от массивов, ниже в первой части статьи будет приведено математическое объяснение этой идеи, а во второй — как с помощью Intel Cilk Plus эту идею использовать в своих программах.

Итак, если есть желание посмотреть на математические формулы и куски кода на C++ в последние дни лета, то добро пожаловать под хабракат.

Читать дальше →
Всего голосов 35: ↑34 и ↓1 +33
Комментарии 18

Введение в параллельные вычисления

Время на прочтение 6 мин
Количество просмотров 43K
Высокая производительность *
Параллельной машиной называют, грубо говоря, набор процессоров, памяти и некоторые методы коммуникации между ними. Это может быть двухядерный процессор в вашем (уже не новом) ноутбуке, многопроцессорный сервер или, например, кластер (суперкомпьютер). Вы можете ничего не знать о таких компьютерах, но вы точно знаете, зачем их строят: скорость, скорость и еще раз скорость. Однако скорость — не единственное преимущество.

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

Что самое удивительное, в университетах пока не спешат переводить программы обучения в русло параллельных вычислений! При этом сегодня нужно постараться, чтобы найти компьютер с одним ядром. В моем родном Carleton University курсы по параллельным вычислениям не входят в обязательную программу Bachelor of Computer Science, и доступны лишь для тех, кто прошел основные курсы первых трех лет. На том же уровне находятся курсы по распределенным вычислениям, и некоторых могут сбить с толку.

Читать дальше →
Всего голосов 100: ↑95 и ↓5 +90
Комментарии 49

Ускорения параллельных вычислений

Время на прочтение 4 мин
Количество просмотров 21K
Высокая производительность *
Главной целью создания и разработки многочисленных типов параллельных машин, о которых мы говорили в прошлой статье, это скорость. Суперкомпьютеры и многопроцессорные системы могут и должны делать все быстрее! Давайте постараемся расчитать, насколько быстрее.

Логично подумать, что если один процессор выполняет работу за n секунд, то четыре процессора потратят n/4 секунд. Понятие “фактор ускорения” (“speedup factor”) это отношение времени, которое тратит на выполнение работы один процессор к времени, которое тратит на эту же работу многопроцессорная система.

S(p) = Ts / Tp

Для расчета важно использовать самый оптимальный Ts, то есть лучший из возможных не-параллельных алгоритмов.

Теперь плохие новости: у этого ускорения есть лимит. Называется он Amdahl’s Law (Закон Амдала) и вот его суть: так выглядит какая-либо задача на обычной однопроцессорной системе:



Читать дальше →
Всего голосов 45: ↑38 и ↓7 +31
Комментарии 31

Параллельные вычисления, класс-обёртка для pcntl_fork()

Время на прочтение 3 мин
Количество просмотров 6.9K
PHP *
Хочу показать свой базовый класс, который я использую для PHP скриптов.
Приемущество его в том, что легко можно «распараллелить» работу.
Используется pcntl_fork() со всеми «вытекающими».

(тестировалось только на линукс)
Читать дальше →
Всего голосов 43: ↑33 и ↓10 +23
Комментарии 47

Акторы как частный случай dataflow

Время на прочтение 1 мин
Количество просмотров 1.3K
Программирование *
Тема акторов в последние годы набирает популярность и некоторым авторам представляется как хит
сезона, хотя само понятие уходит корнями в 70 годы. Особенно усердствуют эрланговцы — одни
заголовки чего стоят — На передовой дизайна виртуальных машин, прямо-таки вспоминаются заголовки советских газет.
Читать дальше →
Всего голосов 14: ↑2 и ↓12 -10
Комментарии 4

Основные тезисы конференции HighLoad++ 2011

Время на прочтение 6 мин
Количество просмотров 4.1K
Я пиарюсь
imageВ октябре 2011 года в Москве проходила ежегодная конференция разработчиков высоконагруженных проектов HighLoad++.
Решил поделиться с читателями основными тезисами с конференции. Поскольку вся информация открыта и доступна на странице конференции, решил что собрать все тезисы вместе будет не такой уж и плохой затеей. Сразу отмечу, что в отчёте не содержится детальной информации о каждом докладе — затронуты лишь ключевые моменты.
Итак, о чём говорилось на HighLoad++ 2011.
Читать дальше →
Всего голосов 32: ↑30 и ↓2 +28
Комментарии 2

AzaThread — многопоточность для PHP с блэкджеком

Время на прочтение 6 мин
Количество просмотров 18K
PHP *
В сети гуляет довольно много решений для эмуляции многопоточности в php. Чаще всего они основываются на форках, но есть и вариации на тему с использованием curl, proc_open и т.п.

Все встреченные варианты по тем или иным причинам меня не устроили и пришлось написать свое решение.
Набор требований у меня был следующий:
  • Использование форков;
  • Синхронный режим с сохранением интерфейса при отсутствии необходимых расширений;
  • Многократное использование дочерних процессов;
  • Полноценный обмен данными между процессами. Т.е. запуск с аргументами и получение результата по завершении;
  • Возможность обмена событиями между дочерним процессом-«потоком» и основным процессом во время работы;
  • Работа с пулом потоков с сохранением многократного использования, передачи аргументов и получения результатов;
  • Обработка ошибок выполнения;
  • Таймауты на выполнение работы, ожидание работы потоком, инициализацию;
  • Максимум производительности;

В результате получилась библиотека AzaThread (старое название — CThread).
Подробности
Всего голосов 156: ↑146 и ↓10 +136
Комментарии 66

Транзакционная память и многопоточность

Время на прочтение 9 мин
Количество просмотров 18K
Блог компании IBM

На фото: Blue Gene / P в Аргоннской национальной лаборатории

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

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

Есть и хорошие новости: в процессорах следующей модели Blue Gene / Q, которые будут питать 20-петафлопсный суперкомпьютер Sequoia, строящийся компанией в настоящее время для Ливерморской национальной лаборатории, реализована поддержка транзакционной памяти не на программном, а аппаратном, уровне. При успешных испытаниях эта технология докажет, что масштабируемое параллельное программирование может быть простой задачей (и в отсутствии параллельных алгоритмов) — это, в свою очередь, изменит ландшафт вычислений. Так как большинство исследований до сегодняшнего дня проводились именно в области реализации STM на уровне ПО, чипы BlueGene/Q позволят реально оценить разницу в скорости работы двух принципиально разных архитектур: HTM (hardware transactional memory) и традиционной STM.

Интересно? Читаем дальше
Всего голосов 35: ↑34 и ↓1 +33
Комментарии 23

Тестирование параллельных потоков

Время на прочтение 5 мин
Количество просмотров 7.8K
TDD *
В дебагере можно без проблем поймать поток исполнения в правильной точке, а затем, после проведения анализа, перезапустить его. В автоматических тестах эти операции выглядят безумно сложными.

А зачем вообще это нужно?

Читать дальше →
Всего голосов 20: ↑20 и ↓0 +20
Комментарии 56