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

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

Еще один тренд современной разработки ПО заключается в том, что традиционный параллелизм при помощи потоков операционной системы (например, 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.