Параллелизм задач (также известный как параллелизм функций и параллелизм управления ) — это форма распараллеливания компьютерного кода на нескольких процессорах в параллельных вычислительных средах. Параллелизм задач фокусируется на распределении задач , выполняемых одновременно процессами или потоками , по разным процессорам. В отличие от параллелизма данных, который подразумевает выполнение одной и той же задачи на разных компонентах данных, параллелизм задач отличается тем, что одновременно выполняется множество различных задач на одних и тех же данных. [1] Распространенным типом параллелизма задач является конвейеризация , которая заключается в перемещении одного набора данных через ряд отдельных задач, где каждая задача может выполняться независимо от других.
В многопроцессорной системе параллелизм задач достигается, когда каждый процессор выполняет другой поток (или процесс) на одних и тех же или разных данных. Потоки могут выполнять один и тот же или разный код. В общем случае разные потоки выполнения взаимодействуют друг с другом в процессе работы, но это не является обязательным требованием. Обычно взаимодействие происходит путем передачи данных из одного потока в другой в рамках рабочего процесса . [ 2]
В качестве простого примера, если система выполняет код на 2-процессорной системе ( ЦП "a" и "b") в параллельной среде, и мы хотим выполнить задачи "A" и "B", можно указать ЦП "a" выполнить задачу "A", а ЦП "b" — задачу "B" одновременно, тем самым сократив время выполнения . Задачи можно назначать с помощью условных операторов , как описано ниже.
Параллелизм задач подчеркивает распределенную (параллельную) природу обработки (т. е. потоков), в отличие от данных ( параллелизм данных ). Большинство реальных программ находятся где-то на континууме между параллелизмом задач и параллелизмом данных. [3]
Параллелизм на уровне потоков ( TLP ) — это параллелизм, присущий приложению, которое запускает несколько потоков одновременно. Этот тип параллелизма в основном встречается в приложениях, написанных для коммерческих серверов, таких как базы данных. Запуская много потоков одновременно, эти приложения способны выдерживать большие объемы задержек ввода-вывода и памяти, которые могут возникнуть из-за их рабочих нагрузок — пока один поток задерживается в ожидании доступа к памяти или диску, другие потоки могут выполнять полезную работу.
Эксплуатация параллелизма на уровне потоков также начала проникать на рынок настольных компьютеров с появлением многоядерных микропроцессоров. Это произошло потому, что по разным причинам становилось все более непрактичным увеличивать либо тактовую частоту, либо количество инструкций за такт одного ядра. Если эта тенденция сохранится, новые приложения придется разрабатывать для использования нескольких потоков, чтобы извлечь выгоду из увеличения потенциальной вычислительной мощности. Это контрастирует с предыдущими инновациями микропроцессоров, в которых существующий код автоматически ускорялся путем его запуска на более новом/быстром компьютере.
Псевдокод ниже иллюстрирует параллелизм задач:
программа:...если ЦП = "а", то выполнить задание "А"иначе если CPU="b" тогда выполнить задание "Б"конец, если...конец программы
Цель программы — выполнить некоторую чистую общую задачу («A+B»). Если мы напишем код, как указано выше, и запустим его на двухпроцессорной системе, то среда выполнения выполнит его следующим образом.
Код, выполняемый ЦП «a»:
программа:...выполнить задание "А"...конец программы
Код, выполняемый процессором «b»:
программа:...выполнить задание "Б"...конец программы
Эту концепцию теперь можно распространить на любое количество процессоров.
Параллелизм задач может поддерживаться в языках общего назначения либо встроенными средствами, либо библиотеками. Известные примеры включают:
Примеры языков с мелкозернистым параллельным выполнением задач можно найти в области языков описания оборудования, таких как Verilog и VHDL .