elizarov


Блог Романа Елизарова


Entries by tag: concurrent

JPoint 2016: Слайды и ссылки
elizarov

JPoint Logo Большое спасибо организаторам конференции JPoint 2016. Конференция получилась отличная, хорошая подборка докладов. Слайды моего доклада "Wait for your fortune without blocking" я уже выложил здесь.

JPoint Student Day тоже получился ничего, хотя и народу было не очень много. Cлайды с доклада "Многопоточное Программирование — Теория и Практика" выложены здесь.

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


Анонс: JPoint 2016: Снова про многопоточное программирование
elizarov

После продолжительного перерыва я снова появлюсь на публике. Больше года я не выступал ни на каких технических конференциях. Этому была вполне уважительная причина, ибо я занимался изучением Финансовой Математики (aka Quantitative Finance). Более подробно эта тема раскрыта в моем недавнем интервью JUG.RU в цикле "Без Слайдов". Теперь всё это позади. Знания получены, экзамены сданы, я получил официально право "to use the CQF designation letters after my name". Но бросать программирование и идти управлять рисками в какой-нибудь банк я пока не планирую. Теперь я снова буду нести свет знаний многопоточного программирования в массы.

JPoint Logo В этом году на конференции JPoint 2016, которая пройдет в Москве 22-23 апреля, я сделаю не "научно-популярный" доклад, а наоборот. Это будет узко-специализированный доклад про мало известную, но порой очень полезную штуку из области синхронизации без блокировок. А именно, как совместить необходимость "усыплять" потоки до наступления какого-либо события с синхронизацией без блокировки, который мы частенько занимаемся ради пресловутой производительности. Но ведь ожидание чего-либо это и есть блокировка? Так? А вот и не так! Более подробно об этой я и расскажу на 2-м дне конференции в докладе под кодовым названием "Жди своего счастья без блокировки!".

Будет и научно-популярный доклад "Многопоточное программирование — Теория и Практика", по мотивам моего доклада на JPoint 2-х летней давности (но с практическими примерами!). Я его сделаю в рамках JPoint Student Day. Это отдельный день (24 апреля), в который пройдет специальная конференция для студентов, еще лишь открывающих для себя дорогу в мир профессионального программированию. Эта как раз та аудитория, которой нужно не столько дать конкретные знанию про ту или иную технологию (ибо технологии поменяются десяток раз в процессе их будущей профессиональной деятельности), сколько рассказать фундаментальные вещи и факты, которые на всю жизнь. А еще, что более важно, их нужно заинтересовать учиться самим. Именно поэтому, в конце доклада я буду рекомендовать прочитать замечательную книгу M. Herlihy. The Art of Multiprocessor Programming. 2012, про которую я в своем время даже отдельно писал. Жаль, что перевода её на Русский так и нет (может кто-нибудь занимается издательской деятельностью и посодействует это исправить?).


Доклад про многопоточные алгоритмы на BitByte 2014
elizarov

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

Моей задачей было заинтересовать слушателей теорией параллельного программирования и, судя по некоторым отзывам, цель была достигнута. Несколько человек, подошедших ко мне после выступления, явно хотели знать больше, и, я надеюсь, займутся самообразованием в этой области. А для сотрудников Devexperts я прочитаю в этом году целый курс из 8 лекций, в котором будет весь этот материал и много, много еще всего. Большую часть материала я возьму из курса лекций, который я читаю в ИТМО, но будет и много нового. Я подготовлю отдельную лекцию исключительно про JMM, где я подробно разберу структуру JMM и научу коллег доказывать и анализировать корректность кода по JMM. Несколько лекций будет посвящено практическим алгоритмам. В плане стоит отдельная лекция только про очереди и отдельная лекция только про хеш-таблицы. Там я не только расскажу и объясню все фундаментальные "классические" многопоточные построения на списках, но и современные достижения в области алгоритмов на массивах которые, как известно и о чем я уже писал, существенно превосходят списочные структуры по производительности на практике.

Слайды и дополнительные материалы под катомCollapse )


Развернутый комментарий про теоретико-параллельный доклад на JPoint 2014
elizarov

На доклады на конференции JPoint 2014 в Москве было выделено по 45 минут. Что можно рассказать за 45 минут из теоретического курса параллельного программирования, который, по-хорошему, занимает целый семестр? Цель моего доклада заключалась в том, чтобы дать слушателям минимально необходимую теоретическую базу, которая позволит прочитать и понять 17-у главу спецификации языка Java (JLS), которая четко регламентирует допустимое поведение многопоточных программ на Java на любой архитектуре CPU. Это значит, что программисту на Java не обязательно разбираться в подробностях и деталях реализации кэшей, протоколов когерентности, параллелизма на уровне инструкций, специальных инструкций и барьеров, как и других особенностей различных архитектур. Это задача для тех, кто пишет JVM или хочет написать самый быстрый код. Программист на Java может писать корректные многопоточные программы, если он четко понимает, какие исполнения его многопоточного кода допустимы с точки зрения спецификации языка Java.

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


Анонс: JPoint 2014: Теоретический минимум, который надо знать, чтобы понять JMM
elizarov

В последнее время на Java конференциях стало появляться множество докладов, которые рассказывать про особенности многопоточного программированию в целом и про Java Memory Model (JMM), которая описана в 17-й главе спецификации языка Java (JLS).

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

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

18 Апреля в Москве пройдет конференция JPoint 2014. На ней я сделаю доклад, который призван восполнить этот досадный пробел современной системы образования программистов, не успевшей еще, в своей массе, подстроиться под реалии многопоточного мира. Там будет минимум практики и максимум теории. Определения, понятия, теоремы. Прослушав этот доклад все термины, которые упоминаются в 17-ой главе JLS, обретут для слушателей понятный и законченный смысл.

Этот доклад будет сделан на основе моего доклада 2012 года "Теория параллельного программирования для программистов практиков". Тот доклад наглядно показал, что нельзя объять необъятное. Попытка впихнуть в отведенное слишком много приводит к тому, что большая часть слушателей так и остается в неведении. Я не буду больше пытаться совмещать теорию и практику, а начну с самых базовых теоритических основ. И не просто пробегусь по верхам, создав максимальную плотность определений в единицу времени, а попытаюсь донести до слушателей суть и смысл всех понятий, используя примеры и диаграммы.

UPDATE: А вот и развернутый комментарий о прошедшем докладе со слайдами с ссылками.


Теория параллельного программирования для программистов практиков
elizarov

В этот четверг, 12 июля 2012 года, в 19:00 в большом конференц-зале бизнес-центра "Воронцов" (Санкт-Петербург, там же где офис Devexperts) в рамках сообщества CodeFreeze я прочитаю доклад на тему "Теория параллельного программирования для программистов практиков". Доклад рассчитан на программистов, которые уже имеют практический опыт написания параллельного кода (прочтение книги “Java Concurrency in Practice” или подобной это большой плюс) и хотели бы узнать теоретические основы, на которых строится практика параллельного программирования.

Наверное, почти все из вас проходили в вузе теоретические основы последовательных вычислений (конечные автоматы, регистровые машины, машины Тьюринга и т.п.), а вот аналогичные конструкции для параллельных вычислений, к сожалению, обойдены вниманием в большинстве вузов. Я расскажу о моделях параллельных вычислений, о разделяемых объектах и их консенсусных числах, об отношении "произошло до" и о линеаризуемости, о разных типах синхронизации без ожидания и об универсальной конструкции, о проблеме ABA и о том, чем помогает GC. Кроме того, я объясню, почему все стандартные "Concurrent" алгоритмы основаны на списках, а все алгоритмы на массивах исключительно "Blocking".

Конечно, в рамках одного доклада нельзя рассказать целый курс. Однако, я многое упростил, убрал доказательства и отобрал только те факты и концепции, которые будут полезны программистам-практикам. Я дам общий обзор различных перспективных направлений для тех, кто захочет углубиться в изучение теории параллельного программирования самостоятельно.

UPDATE: Слайды под катомCollapse )


Память, пропускная способность и многопоточность
elizarov

Оценивая производительность однопоточного кода обычно замеряют время выполнения той или иной операции. Например, как я продемонстрировал ранее, на моем ноутбуке чтение целых чисел из массива и их сложение занимает около 0.37 нс, если чисел мало и они в кэше процессора, и примерно в два раза дольше при последовательном чтении из оперативной памяти. Однако, даже на моем ноутбуке есть два физических ядра, каждое из которых может выполнять по два потока команд одновременно благодаря технологии Hyper Threading (реализации идеи одновременной многопоточности от фирмы Intel), то есть всего 4 аппаратных потока. Для полного использования его ресурсов необходимо обеспечить их все работой, а значит надо писать многопоточный код, что вносит коррективы в методику оценки производительности.

Далее более подробно об этих коррективахCollapse )


Транзакционная память от Intel для x86
elizarov

Мы стоим на пороге новый эры в многопоточном программировании. Компания Intel анонсировала примитивы для транзакционной синхронизации в будущей микроархитектуре Haswell выход которой в свет планируется в 2013 году. Есть все шансы, что он станет первым процессором с подобным механизмом, который доступен широкой публике. Там будет реализована поддержка аппаратного устранения блокировки с помощью префиксов XACQUIRE/XRELEASE и аппаратные транзакции в памяти с помощью инструкций XBEGIN/XEND/XABORT. Оба этих подхода становятся возможными благодаря тому, что в процессоре появится механизм, который позволит ему поддерживать множество прочитанных и множество измененных кэш-линий, отслеживать возникающие конфликты (два доступа из разных транзакций, один из которых на запись), и, что важно, сохранять все изменения в рамках транзакции в основную память атомарно с точки зрения других процессоров или все их отменять.

Подробности под катомCollapse )


Искусство программирования без лишней синхронизации
elizarov

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

Подробности под катомCollapse )


Искусство многопроцессорного программирования
elizarov

В 2005 году я начал преподавать в ИТМО курс параллельного и распределенного программирования. В начале мне порой даже было сложно объяснить важность этого курса. Популярность набирало программирование под мобильные платформы, и на вопрос "зачем мне это нужно — я буду программировать приложения под iPhone" я мог возразить только что-то типа "скоро и мобильные устройства станут многоядерными — уже есть отдельные образцы" и приводил графики, показывающие конец эры экспоненциального роста частоты и вычислительной мощности отдельного процессорного ядра. А сейчас двуядерные мобильные процессоры используются повсеместно и четырехъядерные на подходе, так что всё понятно и без графиков даже тем, кто не пишет код для сложных систем работающих под большой нагрузкой, как это мы делаем в Devexperts.

Читайте историю дальшеCollapse )


?

Log in

No account? Create an account