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


Как вы пишете псевдокод для параллельного программирования? В частности, как вы различаете локальные и общие переменные? Как вы представляете такие операции, как рассредоточение, сбор, сокращение, трансляция и связь "точка-точка"? Есть ли какие-то стандарты по этому поводу?

6 19

6 ответов:

Псевдокод-это в значительной степени просто английский язык. Таким образом, вы можете использовать все, что ясно и недвусмысленно. Это не язык программирования, поэтому вам не нужно представлять операции типа "scatter" .. можно просто сказать "разброс".

Для псевдокода не существует стандартов, но хороший псевдокод прост и понятен.

Я нашел по крайней мере один псевдоязык для параллельного программирования: Peril-L. Это формально, но немного слишком низкий уровень на мой вкус.

Попробуйте "написать диаграммы" здесь: http://www.websequencediagrams.com/

Вы получите лучшее из обоих миров, довольно простые английские утверждения ("псевдокод") и чистые диаграммы. Я смог объяснить довольно сложное параллельное программирование своим менеджерам и коллегам, используя эти диаграммы. И последнее, но не менее важное: можно проверить диаграмму "источник" в системе управления версиями.

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

Рассматривали ли вы возможность применения подхода к развитию, основанного на поведении? Недавно я собрал довольно сложный многопроцессорный/многоядерный фрагмент кода, используя подход BDD, и нашел его очень полезным. Лучшая часть подхода заключалась в том, что я мог описать все на простом английском языке и сосредоточиться на проблеме, а не на деталях реализации. Мои первые несколько итераций были однопоточными, чтобы убедиться, что код прошел все тесты и решил проблему. Я увеличил производительность системы используя многопроцессорную обработку в выбранных местах, одновременно убеждаясь, что она не нарушит тесты, которые прошла однопоточная система. Рефакторинг был намного проще, потому что код уже был значительно проще, чем если бы я разрабатывал детали оптимизации преждевременно, и я мог сосредоточиться на мониторинге времени обработки пересчитанных систем, так как я получал точно такие же результаты, как и предыдущие итерации.

Взгляните на книгу Разработка на основе тестов для встроенного C для некоторых идей. Я использовал эту книгу во время своего развития и сделал ее постоянной частью своей библиотеки.

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

Это связано с тем, что существует множество способов параллельного программирования, в терминах различных параллельных архитектур (например, SMPs, GPU, кластеры и другие экзотические системы) и подходов к параллельному программированию. Я говорю о "подходах программирования", потому что, как правило, большинство из них являются библиотеками или аннотациями, а не языками (см. MPI, OpenMP, TBB и т. д.). Так что, даже если вы можете выбрать архитектуру и язык, вам будет трудно определить семантику библиотеки или системы аннотаций. К счастью, были разработаны более строго определенные подходы к программированию. Однако они, как правило, основаны либо на общей памяти , либо на передаче сообщений. Поиск подходящей нотации / псевдокода будет зависеть от того, в какой степени вам требуется определить семантику и какие типы задач параллельного программирования вы пытаетесь решить. экспресс.

Вот два предложения:

  • коляска . Программирование с использованием общей памяти тесно связано с моделью параллельных вычислений с произвольным доступом (PRAM). Это было широко изучено и разработано множество алгоритмов. Быстрый поиск литературы позволит найти подходящие обозначения коляски.
  • CSP . Коммуникационные последовательные процессы (CSP)-это формализм (алгебра) для выражения и рассуждения о системах передачи сообщений. Он был оказал влияние на дизайн многих языков, в частностиОккама .

Модель PRAM очень проста и должна использоваться в качестве основы для нотаций программирования с общей памятью. Сам CSP может быть слишком математическим для псевдокода, а нотация Оккама может быть слишком многословной. Это была точка зрения Бринча Хансена (Великого в параллельном программировании), который разработал свой собственный родственный язык, SuperPascal, который будет использоваться в качестве обозначения для объяснения параллельных алгоритмов в параллельном программировании. печатная продукция.

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