Настройка OpenMP в CLion и пример программы

Доброго времени суток! Продолжаем рассматривать варианты параллельного исполнения программ. Я уже рассказывал про библиотеку MPI, которая позволяет создавать несколько параллельно исполняемых процессов в системе. Рассказал о базовой установке MPI, интеграции его в CLion и даже поделился своей реализацией алгоритма Флойда-Уоршелла.

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

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

Что такое OpenMP

Признанным открытым стандартном параллельного программирования на языках C/C++ и Fortran является OpenMP. Он включает в себя множество директив препроцессора, библиотечных функций и переменных окружения для реализации многопоточных программ. Более подробную информацию вы сможете найти на вики и прочих источниках, а я перейду непосредственно к настройке.

читать далее «Настройка OpenMP в CLion и пример программы»

Реализация параллельного алгоритма Флойда-Уоршелла

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

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

В качестве инструмента будет использована уже знакомая библиотека MPICH(установка библиотеки).

Схема параллельного алгоритма Флойда-Уоршелла

В оригинальном линейном алгоритме единственная операция это нахождение минимума, как справедливо замечено в крохах источников, что я находил, ее нет смысла распараллеливать. Вся сложность алгоритма(О^3) заключается в полном переборе «матрицы смежности». Напомню, что я так называю матрицу размера NxN, в которой на пересечении i-й строки и j-го столбца стоит вес ребра из i-ой вершины в j-ую.

читать далее «Реализация параллельного алгоритма Флойда-Уоршелла»

Настройка библиотеки MPI в CLion

Привет «параллельным программистам», мы продолжаем настраивать библиотеку MPICH везде, где это возможно и сегодня на операционном столе замечательная IDE CLion от JetBrains. До этого я уже рассказывал о том, как установить библиотеку MPI в систему Linux, и затронул тему настройки MPI в Eclipse.

Необходимо сразу подчеркнуть, что сейчас будет сказка, настройка в CLion несравнимо проще, чем в Eclipse. CLion сам по себе на голову выше многих IDE, поэтому если вы можете себе его позволить, то незамедлительно позволяйте. Сам я бедный студент ЧелГУ и пользуюсь лицензией для студентов, которая будет действовать до тех пор, пока числюсь в списках университета. Спасибо JetBrains за такую возможность!

Подключить библиотеку MPI в CLion

Проекты на C/C++ в CLion`е собираются с помощью автоматизированной кроссплатформенной системы сборки CMake. Суть в двух словах, мы пишем файл CMakeLists.txt в корне проекта, который содержит правила для сборки, на которые ориентируется Make, либо ее аналог в Windows. Более подробно о CMake на вики и статья на хабре.

читать далее «Настройка библиотеки MPI в CLion»

Общение процессов в MPI

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

Набор статей про библиотеку MPI разрастается, поэтому я решил привести список предыдущих «серий». Итак, мы уже умеем:
устанавливать MPI в Linux Ubuntu
настраивать Eclipse для работы с MPI
писать простейшую программу с помощью базовых функций MPI

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

Функции отправки сообщения MPI_Send и MPI_Isend

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

читать далее «Общение процессов в MPI»

Основные функции MPI и пример простейшей программы

Приветствую всех в третьей статье посвященной параллельному программированию с помощью библиотеки MPICH. В прошлых сериях мы научились устанавливать MPI в Linux Ubuntu и заставили Eclipse понимать код библиотеки. Наконец пришло время взяться за программирование. А какую программу должен написать каждый уважающий себя программист? Правильно, сегодня мы напишем «Hello World» на MPI, и заодно глянем на самые базовые функции библиотеки. Поехали!

Основные функции MPI

Я сейчас говорю о тех, которые помогут нам грамотно идентифицировать каждый процесс, чтобы управлять общей логикой приложения. Реализовано это следующим образом: все процессы делятся на группы, называемые коммуникаторами, при этом один процесс может находиться сразу в нескольких коммуникаторах. По умолчанию все процессы попадают в коммуникатор MPI_COMM_WORLD. Каждый процесс имеет порядковый номер в коммуникаторе, называемый рангом. Как правило, процесс с рангом 0 назначается главным, он рулит бизнес логикой приложения и раздает команды другим процессам, еще он может отвечать за вывод в консоль, если вывод предусмотрен.

читать далее «Основные функции MPI и пример простейшей программы»