Параллельные вычисления — это тип вычислений , при котором множество вычислений или процессов выполняются одновременно. [1] Большие проблемы часто можно разделить на более мелкие, которые затем можно решить одновременно. Существует несколько различных форм параллельных вычислений: параллелизм на уровне битов, на уровне инструкций , данных и параллелизм задач . Параллелизм уже давно используется в высокопроизводительных вычислениях , но приобрел более широкий интерес из-за физических ограничений, препятствующих масштабированию частоты . [2]Поскольку потребление энергии (и, следовательно, выделение тепла) компьютерами в последние годы стало проблемой [3] , параллельные вычисления стали доминирующей парадигмой в компьютерной архитектуре , в основном в виде многоядерных процессоров . [4]
Параллельные вычисления тесно связаны с параллельными вычислениями — они часто используются вместе и часто объединяются, хотя они и различаются: возможен параллелизм без параллелизма (например, параллелизм на уровне битов ) и параллелизм без параллелизма (например, многозадачность). с разделением времени на одноядерном процессоре). [5] [6] В параллельных вычислениях вычислительная задача обычно разбивается на несколько, часто много, очень похожих подзадач, которые могут обрабатываться независимо и чьи результаты впоследствии объединяются после завершения. Напротив, при параллельных вычислениях различные процессы часто не решают связанных задач; когда они это делают, как это типично для распределенных вычислений, отдельные задачи могут иметь различную природу и часто требуют взаимодействия между процессами во время выполнения.
Параллельные компьютеры можно грубо классифицировать в соответствии с уровнем, на котором аппаратное обеспечение поддерживает параллелизм: многоядерные и многопроцессорные компьютеры имеют несколько процессорных элементов на одной машине, в то время как кластеры , MPP и сети используют несколько компьютеров для работы на одной и той же машине. задача. Специализированные параллельные компьютерные архитектуры иногда используются вместе с традиционными процессорами для ускорения определенных задач.
В некоторых случаях параллелизм прозрачен для программиста, например, в параллелизме на уровне битов или на уровне команд, но явно параллельные алгоритмы , особенно те, которые используют параллелизм, написать труднее, чем последовательные [ 7] , потому что параллелизм вводит несколько новых классы потенциальных программных ошибок , из которых условия гонки являются наиболее распространенными. Обмен данными и синхронизация между различными подзадачами обычно являются одними из самых серьезных препятствий для достижения оптимальной производительности параллельной программы.
Теоретическая верхняя граница ускорения отдельной программы в результате распараллеливания дается законом Амдала .
Традиционно компьютерное программное обеспечение было написано для последовательных вычислений . Для решения задачи алгоритм строится и реализуется в виде последовательного потока инструкций. Эти инструкции выполняются на центральном процессоре одного компьютера. Одновременно может выполняться только одна инструкция — после завершения этой инструкции выполняется следующая. [8]