Condividi tramite


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

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

Еще один тренд современной разработки ПО заключается в том, что традиционный параллелизм при помощи потоков операционной системы (например, WinAPI и POSIX Threads) – это слишком низкоуровнево, а поэтому сложно в использовании и недостаточно производительно. Этот тренд выражается не только в блогах и научных статьях, но и в многочисленных практических разработках, например: Parallel LINQ, Task Parallel Library, Concurrency Runtime (кстати, на уже недалеком PDC’09 будет весьма немало уделено внимания технологиям и библиотекам параллельным разработки, в том числе и упоминаемым выше).

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

Классификация подходов к параллелизации программ

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

Одна из полезных классификаций видов параллелизма, присутствующего в программах – это разделение на параллелизм задач (task parallelism) и параллелизм данных (data parallelism). Использование каждого из этих видов можно производить разными способами (иногда ортогональными, иногда нет), о которых мы постараемся рассказать в этом блоге, а сейчас сделаем краткий обзор.

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

· разбиение программы на параллельно выполняемые фрагменты (ручное при помощи обычного языка программирования, ручное при помощи специального языка программирования, автоматическое),

· анализ фрагментов программы на наличие взаимозависимостей (ручной, автоматический, автоматический спекулятивный),

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

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

· выделение параллелизма данных из обычной программы (низкоуровневое ручное, высокоуровневое ручное, автоматическое),

· отображение параллелизма данных на специализированные устройства (модули SSE центральных процессоров, графические процессоры, микропроцессоры Cell и т.п.)

В ближайших теоретических постах

Рассмотрим техники использования параллелизма по данным (ссылка на посты), начав с модели SIMD - подхода индустриальной мощности к разработке data-parallel программ и устройств, их исполняющих. В этом направлении также рассмотрим современные тенденции в развитии SIMD. Альтернативным темой постов будет изучение программных моделей для выделения параллелизма уровня задач (ссылка на посты), присутствующего в программе – обсудим способы явного задания параллелизма в популярных и специализированных языках программирования.

Подводя итог

Наряду с освещением значительных новостей в мире HPC и разбором практических примеров применения популярных технологий в этом блоге мы также будем рассказывать про теоретические основы и модели параллельных вычислений. Понимание теоретических основ влияет прежде всего на стиль мышления программиста при решении практических задач. Таким образом, наш блог станет своего рода базой знаний по различным аспектам параллельного программирования под Windows HPC Server.

Comments

  • Anonymous
    November 24, 2009
    Я думаю эта часть текста вам пригодится. Производится классификация параллельных вычислительных систем и способов распараллеливания. Приводятся «исторические» примеры параллельных ВС. Изучается проблема распараллеливания на уровне исполнительных устройств. Рассматривается организация конвейеров операций, векторных конвейеров, выполнения операций на стеке. Исследуются принципы динамического распараллеливания в многофункциональном арифметическо-логическом устройстве. Изучаются принципы «статического» составления потактового расписания работы процессора, управляемого в каждом такте. Такая компоновка командных слов характерна для суперскалеров VLIW- и EPIC-архитектуры. Освещается проблема организации интенсивного ветвления вычислений с помощью команды выполнения логического оператора и механизма предикатов, без традиционного использования команд условного перехода. Иллюстрируется возможность эффективного программирования конкретных задач. Рассматриваются некоторые «нетрадиционные» архитектуры, отражающие альтернативный поиск и эффективные решения при создании современных архитектур многопроцессорных вычислительных систем. Рассматривается проблема использования языка высокого уровня в качестве ассемблера - единственно доступного языка пользователя, включающего сложные алгоритмические конструкции. Аппаратная поддержка такого языка выполнена в отечественном семействе «Эльбрус». Обсуждается проблема практического применения принципа data flow при построении асинхронных вычислительных систем. Приводятся примеры программирования. Рассматривается архитектура вычислительной системы, основанная на принципе SPMD - «одна программа – много потоков данных». Анализируется возможность применения SPMD-технологии к решению задач логического вывода. Рассматривается проблема когерентности кэш-памяти в многопроцессорной системе.

  • Anonymous
    November 24, 2009
    Спасибо! Можно было бы в принципе ссылку дать :-) На сколько я понимаю, вот она http://www.intuit.ru/department/hardware/paralltech/ Мы, безусловно, многих тем коснемся в своих будущих статьях. 

  • Anonymous
    December 12, 2013
    Продолжайте. Это очень интересно, хочется больше примеров. Хотелось бы тоже по участвовать в написании статей.