Для установки нажмите кнопочку Установить расширение. И это всё.

Исходный код расширения WIKI 2 регулярно проверяется специалистами Mozilla Foundation, Google и Apple. Вы также можете это сделать в любой момент.

4,5
Келли Слэйтон
Мои поздравления с отличным проектом... что за великолепная идея!
Александр Григорьевский
Я использую WIKI 2 каждый день
и почти забыл как выглядит оригинальная Википедия.
Статистика
На русском, статей
Улучшено за 24 ч.
Добавлено за 24 ч.
Альтернативы
Недавние
Show all languages
Что мы делаем. Каждая страница проходит через несколько сотен совершенствующих техник. Совершенно та же Википедия. Только лучше.
.
Лео
Ньютон
Яркие
Мягкие

Распараллеливание цикла

Из Википедии — свободной энциклопедии

Распараллеливание цикла — разновидность параллелизма в программировании, при котором цикл разбивается на задачи, выполняемые параллельно. Обычно возможность распараллеливания циклов возникает в программах, в которых данные хранятся в структурах с произвольным доступом. В отличие от последовательного алгоритма[en], который перебирал бы структуру данных и работал с индексами по одному, алгоритм с распараллеленным циклом будет использовать несколько потоков или процессов, которые работают с несколькими или всеми индексами одновременно. Такой параллелизм уменьшает общее время выполнения программы, обычно в соответствии с законом Амдала[1].

Описание

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

Пример

Рассмотрим следующий код, работающий со списком L длины n:

for (int i = 0; i < n; ++i) {
     S1: L[i] += 10;
}

При каждой итерации цикл берет значение из текущего индекса L и увеличивает его на 10. Если оператору S1 требуется время для выполнения T, то циклу требуется время для последовательного выполнения n * T без учёта времени, затрачиваемого конструкциями самого цикла. Теперь рассмотрим систему с p процессорами, где p > n. Если n потоков выполняются параллельно, время выполнения всех n шагов сокращается до T.

Более сложные случаи могут привести к непредсказуемым результатам. Рассмотрим следующий цикл, работающий с тем же списком L:

for (int i = 0; i < n; ++i) {
     S1: L[i] = L[i-1] + 10;
}

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

См. также

Примечания

  1. Д.И. Черемисинов. Закон Амдала и границы параллельных вычислений (pdf). Шестая Международная научно-практическая конференция «BIG DATA and Advanced Analytics. BIG DATA и анализ высокого уровня» (2020). Дата обращения: 23 марта 2023. Архивировано 27 апреля 2022 года.
  2. В. В. Воеводин. Параллелизм в сложных программных комплексах (Почему сложно создавать эффективные прикладные пакеты) (pdf). Чебышевский сборник. Том 18 Выпуск 3 (2017). Дата обращения: 23 марта 2023. Архивировано 23 марта 2023 года.
  3. Р.К. Газизов, С.Ю. Лукащук, К.И. Михайленко. Параллельный полуявный алгоритм численного решения задач динамики жидкости (pdf). Высокопрозводительные параллельные вычисления на кластерных системах (2002). Дата обращения: 23 марта 2023. Архивировано 21 сентября 2018 года.
Эта страница в последний раз была отредактирована 13 ноября 2023 в 03:33.
Как только страница обновилась в Википедии она обновляется в Вики 2.
Обычно почти сразу, изредка в течении часа.
Основа этой страницы находится в Википедии. Текст доступен по лицензии CC BY-SA 3.0 Unported License. Нетекстовые медиаданные доступны под собственными лицензиями. Wikipedia® — зарегистрированный товарный знак организации Wikimedia Foundation, Inc. WIKI 2 является независимой компанией и не аффилирована с Фондом Викимедиа (Wikimedia Foundation).