`

СПЕЦИАЛЬНЫЕ
ПАРТНЕРЫ
ПРОЕКТА

Архив номеров

Как изменилось финансирование ИТ-направления в вашей организации?

Best CIO

Определение наиболее профессиональных ИТ-управленцев, лидеров и экспертов в своих отраслях

Человек года

Кто внес наибольший вклад в развитие украинского ИТ-рынка.

Продукт года

Награды «Продукт года» еженедельника «Компьютерное обозрение» за наиболее выдающиеся ИТ-товары

 

Многопоточное программирование — в массы

Статья опубликована в №32 (698) от 15 сентября

+44
голоса

Эра многоядерных микропроцессоров самой распространенной архитектуры x86 началась с двухъядерного Pentium D, увидевшего свет более четырех лет назад. В то время некоторые эксперты прогнозировали, что число ядер в массовых настольных чипах будет стремительно увеличиваться с каждым годом и лет через пять достигнет десятков, если не сотен. Однако смелым прогнозам не суждено было сбыться, и сегодня типичный ПК все так же оснащен двухъядерным процессором.

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

Многопоточное программирование — в массы
Цикл разработки многопоточного ПО по версии Intel

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

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

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

Intel Parallel Studio

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

Ситуация изменилась нынешней весной с выпуском нового продукта, ориентированного на самые широкие программистские круги – Intel Parallel Studio. Пакет представляет собой дополнение для Microsoft Visual Studio (VS) и состоит из относительно независимых компонентов, три из которых (Amplifier, Composer и Inspector) вошли в первую версию продукта, а четвертый (Advisor) появится одновременно с VS 2010 (ko-online.com.ua/44078) – каждый можно приобрести и использовать по отдельности. Однако у Intel Parallel Studio имеется существенный недостаток, состоящий в отсутствии поддержки .NET Framework (инструменты предназначены только для «неуправляемых» C/C++). С одной стороны, это можно объяснить тем, что именно неуправляемый код, ввиду отсутствия дополнительной программной прослойки, предоставляет максимум возможностей для оптимизации с учетом аппаратных особенностей платформы. С другой – с учетом все большего распространения языков, требующих для своего исполнения виртуальной машины, значительное число разработчиков не могут применять рассматриваемый продукт в своей практике. Тем не менее лиха беда начало, и Intel Parallel Studio вполне заслуживает более близкого знакомства.

Многопоточное программирование — в массы
Intel Parallel Amplifier – профилировщик программного кода с богатыми возможностями

Intel Parallel Amplifier – это функциональный профилировщик программного кода, ориентированный как на одно-, так и на многопоточные приложения. Несмотря на то что Amplifier – новый продукт, он в значительной степени основан на достаточно популярном Intel VTune Performance Analyzer, имеющем многолетнюю историю и пользующемся заслуженным авторитетом у специалистов. Правда, Amplifier обладает несколько более скромной функциональностью, но и ее вполне достаточно для успешного выявления в коде «горячих точек» (hotspots). В частности, Amplifier позволяет собрать статистику продолжительности исполнения фрагментов кода и представить ее в наглядном виде, детализируя вплоть до отдельных операций; исследовать код на предмет эффективного использования процессорных ядер и выявить те участки, которые получат больше всего выгод от распараллеливания; определить точки, в которых программа приостанавливает исполнение по причине ожидания освобождения блокировок или завершения исполнения дополнительных потоков. Приложение также предоставляет возможности визуального сравнения результатов анализа кода, полученных в различное время, что может быть очень полезно в процессе выполнения тонкой оптимизации создаваемой программы.

Intel Parallel Composer – это инструмент, с помощью которого непосредственно выполняется оптимизация кода, фактически представляет собой набор библиотек и компилятор C++ от Intel, а также расширения для отладчика VS. В частности, библиотека Intel IPP (Integrated Performance Primtives) содержит эффективную многопоточную реализацию множества (счет идет на тысячи) функций, которые часто встречаются при разработке самых разных приложений. Дополнительно доступна библиотека с параллельной реализацией распространенных криптографических алгоритмов IPP Cryptography. Еще одна составляющая Composer – Intel TBB (Threading Building Blocks), библиотека шаблонов для построения параллельных приложений, избавляющая разработчика от создания низкоуровневого кода при реализации типичных задач, требующих управления потоками. Помимо «традиционных» механизмов распараллеливания, предусматривающих явное управление потоками, Parallel Composer также поддерживает применение API OpenMP (openmp.org), посредством которого распараллеливание можно осуществить за счет указания специальных директив компилятора, не модифицируя напрямую исходный код.

Многопоточное программирование — в массы
Intel Parallel Inspector позволяет выявлять типичные ошибки, возникающие в процессе создания многопоточного кода

Intel Parallel Inspector предназначен для выявления ошибок при использовании оперативной памяти и исполнении потоков. При анализе работы приложения с ОЗУ Parallel Inspector позволяет выявлять типичные ошибки в неуправляемом коде: неверные ссылки на объекты, несоответствие операций выделения/высвобождения ОЗУ, утечки памяти, проблемы с применением стека. При исследовании потоков Parallel Inspector контролируются взаимные блокировки и ошибки, связанные с так называемым «состоянием гонки». Помимо этого, в прилагаемой к Parallel Inspector документации приведены подробные описания возможных недочетов с примерами и рекомендациями по их исключению, что особенно пригодится недостаточно опытным программистам.

Для все еще находящегося в разработке Intel Parallel Advisor уже доступна ознакомительная Lite-версия, которая устанавливается в дополнение к Parallel Studio (релиз ожидается до конца года). Этот компонент выявляет фрагменты, допускающие параллельное исполнение, предлагает разработчику типичные способы распараллеливания, а также находит и предотвращает сопутствующие этому процессу ошибки и побочные эффекты. Следовательно, Intel Parallel Advisor должен использоваться на самых первых этапах проектирования, особенно при преобразовании существующих однопоточных приложений в многопоточные.

В целом Intel Parallel Studio производит впечатление достаточно перспективного продукта, вполне пригодного для массового использования программистами на C/C++. Основным же недостатком его, как уже отмечалось, является отсутствие поддержки .NET Framework. Еще одним сдерживающим фактором может стать цена – полный пакет Intel Parallel Studio стоит столько же, сколько вся профессиональная редакция VS.

Microsoft Parallel Computing Platform

Проект Microsoft Parallel Computing Platform (PCP) стартовал около трех лет назад, когда сотрудникам компании стало понятно, что для эффективного перевода процесса разработки ПО на многоядерные рельсы требуется гораздо больше, чем просто обеспечить сторонних программистов соответствующими инструментальными средствами. Основных проблем здесь несколько. Во-первых, оказалось очень сложно убедить разработчиков создавать новые приложения многопоточными – закон Мура применительно к системам с одним вычислительным ядром приучил многих обходиться без тщательной оптимизации кода, поскольку проблема низкой производительности постепенно решалась «сама собой» с очередным поколением чипов. Разработка же многопоточных приложений традиционными методами – процесс весьма трудоемкий, а выгоды от него в краткосрочной перспективе не столь очевидны (хотя бы потому, что массовые ПК все еще не оснащены процессорами с большим числом ядер). Во-вторых, куда более серьезной оказалась проблема с модернизацией старых приложений – перепроектировать готовое решение в многопоточное часто экономически нецелесообразно.

Разработчики из Microsoft нашли выход в том, чтобы снабдить платформу .NET Framework средствами, которые позволяют осуществлять распараллеливание максимально прозрачно: в идеале – полностью автоматически, но поскольку это все-таки труднодостижимо, то хотя бы таким образом, чтобы вмешательство программиста было минимальным и сводилось к выявлению и обозначению подлежащих параллельному исполнению фрагментов кода. В общем, идея не нова, схожий принцип применяется в уже упоминавшейся инициативе OpenMP, однако при реализации на более высоком уровне абстракции, каковым является среда .NET Framework, у него возникают дополнительные преимущества, в том числе и простота использования.

Несмотря на то что распараллеливание в ручном режиме дает больше возможностей, у него по сравнению с подходом, предложенным Microsoft, есть несколько неочевидных, на первый взгляд, но, тем не менее, весьма значимых недостатков. Прежде всего с учетом отладки и тестирования требуется заметно больше усилий, что, в свою очередь, ведет к увеличению затрат на разработку и может служить источником весьма трудноуловимых, а иногда и фатальных ошибок. Достаточно сказать, что при описании такого типичного для многопоточного программирования явления, как «состояние гонки» (race condition), часто упоминают случай с аппаратом лучевой терапии Therac-25, который унес жизни нескольких человек, при этом истинная причина неисправности долгое время оставалась неизвестной. Кроме того, выполненное в ручном режиме распараллеливание отнюдь не гарантирует, что результат будет эффективнее полученного автоматическими средствами – для этого требуются довольно высокая квалификация и опыт разработчика. Наконец, оптимизация под конкретную аппаратную платформу может оказаться недостаточно эффективной в будущем, при существенном изменении архитектуры процессоров. Автоматическое же распараллеливание на уровне среды исполнения, напротив, может легко подстраиваться под конкретную аппаратную платформу.

Практическое воплощение PCP нашла в расширениях к ожидаемому в последнем квартале года релизу .NET Framework 4.0, получивших название Parallel Extensions. В настоящее время сюда относятся «параллельная» версия языка LINQ – Parallel LINQ (PLINQ), библиотека Task Parallel Library (TPL) и набор структур данных, предназначенных для синхронизации и координации исполнения параллельных задач Coordination Data Structures (CDS).

В основе концепции Parallel Extensions находится понятие задачи (Task) – небольшого и сравнительно независимого участка кода, который может быть исполнен параллельно с другими себе подобными. Всем процессом управляет специальный планировщик (Task Manager), поддерживающий глобальную очередь задач и распределяющий их для исполнения по потокам, число которых по умолчанию устанавливается равным количеству вычислительных ядер в системе. Таким образом, от разработчика требуется лишь указание участков кода, которые могут быть выделены в задачи (в первую очередь это блоки повторяющихся операций – циклы, рекурсии и т. п.). Разумеется, они не должны использовать общие данные, иначе потребуется их явная синхронизация посредством блокировок или других конструкций.

Разметка задач осуществляется посредством вызова предназначенных для этого статических методов класса Parallel, входящего в пространство имен System.Threading. В частности, методы Parallel.For() или Parallel.Foreach() преобразуют обычный последовательно исполняемый цикл в параллельный. Для разметки произвольных участков их следует оформить в отдельные методы, а далее вызвать с помощью Parallel.Invoke().

Использование PLINQ оказывается еще проще – в тех случаях, когда LINQ-запрос может исполняться параллельно, в его текст следует добавить «.AsParalell()» после указания источника данных. Поскольку для некоторых ситуаций распараллеливание может не дать должного эффекта, а наоборот, привести к ухудшению производительности, в PCP, в частности в PLINQ, реализованы механизмы оценки необходимости запуска отдельных потоков. Разумеется, возможно и более гибкое управление ходом исполнения параллельных задач, но смысл всего подхода Microsoft состоит именно в том, чтобы сделать реализацию параллельного исполнения как можно проще.

Многопоточное программирование — в массы
Архитектура PCP предусматривает расширения для управляемого и неуправляемого кода, которые могут быть использованы для решения разных по своей природе задач

Примечательно, что PCP не ограничивается исключительно управляемым кодом, существует поддержка и «неуправляемого» C++ в виде аналога TPL под названием Parallel Pattern Library, а также пока еще не имеющей прямого аналога в управляемом коде библиотеки шаблонов для реализации асинхронных агентов (Agents Library) – хотя последняя будет особенно интересной для.NET Framework. Также отметим, что помимо собственно платформы для распараллеливания задач грядущая версия Visual Studio 2010 будет содержать множество усовершенствований для отладки многопоточного кода. Если говорить о более далекой перспективе, то среди исследовательских проектов имеется даже посвященный параллельным вычислениям с применением GPU, что выглядит не так уж фантастично в свете скорого появления гибридного микропроцессора Intel Larrabee. Кроме того, ведутся работы над использованием вычислительных возможностей ПК, объединенных в рамках одной сети – таким образом, к примеру, можно будет плавно перераспределять нагрузку между всеми компьютерами, составляющими домашнюю или офисную сеть, архитектура PCP вполне допускает и такой сценарий.

Следует также отметить, что PCP является всего лишь одной из составляющих более комплексной инициативы – Microsoft Parallel Computing Initiative, охватывающей различные подразделения и направления деятельности компании – не исключено, что мы еще увидим достаточно неожиданные результаты синергии различных проектов.

Заключение

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

Сайт автора: koldovsky.com

+44
голоса

Напечатать Отправить другу

Читайте также

 
 
IDC
Реклама

  •  Home  •  Рынок  •  ИТ-директор  •  CloudComputing  •  Hard  •  Soft  •  Сети  •  Безопасность  •  Наука  •  IoT