Распараллеливание
Архитектура современных суперкомпьютеров
by dmitry on Сен.12, 2008, under Распараллеливание
Эта обзорная статья, в которой я постараюсь избегать подробностей и ненужных деталей, предназначена она в основном для новичков.
Есть два подхода при построении современных суперкомпьютеров – системы с общей памятью и так называемые кластеры. Каждый подход не исключает другого, у каждого подхода есть свои достоиинства и недостатки. Плюс систем с общей памятью – универсальность модели параллельного ПО, не требующей какого либо дополнительного кода, или не требующей значительных изменений кода. Плюс кластерных систем – отказоустойчивость и более лучшая масштабируемость. Системы с общей памятью плохо масштабируются при росте числа вычислительных процессоров, кластеры же масштабируются плохо из-за возрастающей сложности сети при добавлении узлов, но это происходит значительно позднее, когда число процессоров измеряется сотнями и даже тысячами. Рассмотрим подробнее оба этих подхода
(continue reading…)
Обзор способов параллельного программирования
by dmitry on Март.10, 2008, under Распараллеливание
В этой статье подробно рассматриваются различные подходы к параллельному программированию.
Наиболее широкоизвестные способы параллельного программирования
- Threads / Processes
- OpenMP
- MPI
Исторически сложилось так, что наиболее часто применяемый способ – это Threads в их различных реинкарнациях. Способ хорош тем что не требует дополнительных библиотек. Чтобы использовать этот вариант, достаточно имеющихся возможностей OC. Обычно используется для скрытия от пользователя различных продолжительных операций, чтобы не терять возможность отрисовки GUI в момент ожидания операции. Основное достоинство – потоки разделяют адресное пространства и принадлежат одному процессу. Поэтому все передачи данных между потоками выполняются максимально быстро. Чаще всего достаточно передать указатель. Синхронизация потоков не затратна и не требует системных вызовов (Syscall) – долгих операций с переключением контекста. Сюда же можно отнести и многопроцессные программы в самом простейшем виде – использующие fork() или что-то подобное из системных функций для порождения нового процесса, но применяющее для синхронизации и обмена данными системное API.
(continue reading…)