Параллелизм данных |
Автор: admin Просмотров: 2026 Комментарии:
Добавлен: 17 апреля 2016
Параллелизм данных является одной из форм распараллеливания вычислений между несколькими процессорами в параллельных вычислительных средах. Параллелизм данных фокусируется на распространении данных по различным параллельных вычислительным узлам. Это контрастирует с параллелизмом задач как еще одна формой параллельности.
В многопроцессорной системе, выполняющей единый набор инструкций (SIMD), параллелизм данных достигается, когда каждый процессор выполняет одну задачу на различных частях распределенных данных. В некоторых случаях, одной управляющей связью на всех частях данных. В противном случае, различные потоки контролируют работу, но они выполняют одинаковый код.
Например есть двухпроцессораная система (CPU A и B) в параллельном окружении, и мы хотим, выполнить задание над данными d. Можно задать CPU A выполнять это задание на одной части данных d, и CPU B одновременно на другой, тем самым снижая продолжительность выполнения. Эти данные могут быть заданы с помощью условных операторов, как описано ниже. В качестве конкретного примера рассмотрим сложение двух матриц. В параллельной реализации данных CPU A может добавить все элементы с верхней половины матриц, в то время как CPU B будет прилагать все элементы из нижней половины матриц. Поскольку два процессора работают параллельно, работа над матрицами займет в 2 раза меньше времени, чем выполнение этой задачи на одном процессоре. Параллелизм данных подчеркивает распределенный (распараллеленый) характер данных, в отличие от обработки (параллелизм задач).
Большинство реальных программ находятся между параллелизмом задач и параллелизмом данных.
Пример
Программа выраженная псевдокодом, который выполняет какую-то произвольную операцию, foo , над каждым элементом в массиве d, демонстрируя параллельность данных:
if CPU = "a"
lower_limit = 1
upper_limit = round (d.length / 2)
else if CPU = "b"
lower_limit = round (d.length / 2) + 1
upper_limit = d.length
for и from lower_limit to upper_limit by 1
foo (d [i])
Если в примере выше программа выполняется на двухпроцессорной системе, среда может выполнять его следующим образом:
В системе SPMD, оба процессора будут выполнять код.
В параллельном среде, оба будут иметь доступ к d.
Механизм предусматривает нахождение в месте, где каждый процессор может создать свои копии upper_limit и lower_limit, которые являются независимыми.
Оператор if разграничивает работу процессоров. CPU A будет считывать true в if ; а CPU B будет считывать true в else if , таким образом они имеют свои собственные значения upper_limit и lower_limit.
Сейчас, оба процессора выполняют foo (d [i]), но, поскольку каждый процессор имеет разные значения границ, они работают на разных частях d одновременно, тем самым распределяют задачи между собой. Очевидно, что они будут выполнять это быстрее, чем один процессор.
Эту концепцию можно обобщить на любом количестве процессоров. Однако, когда число процессоров увеличено, полезно перестроить программу подобным путем (где cpuid является числом между 1 и количеством процессоров и действий как уникальный идентификатор для каждого процессора):
for и from cpuid to d.length by number_of_cpus
foo (d [i])
Например, на 2-процессорной системе CPU A ( cpuid 1) будет работать на нечетных значениях и CPU B ( cpuid 2) будет работать на четных значениях.
------------------------
ТРИО теплый пол отзыв
Заработок на сокращении ссылок
Earnings on reducing links
Код PHP на HTML сайты
В многопроцессорной системе, выполняющей единый набор инструкций (SIMD), параллелизм данных достигается, когда каждый процессор выполняет одну задачу на различных частях распределенных данных. В некоторых случаях, одной управляющей связью на всех частях данных. В противном случае, различные потоки контролируют работу, но они выполняют одинаковый код.
Например есть двухпроцессораная система (CPU A и B) в параллельном окружении, и мы хотим, выполнить задание над данными d. Можно задать CPU A выполнять это задание на одной части данных d, и CPU B одновременно на другой, тем самым снижая продолжительность выполнения. Эти данные могут быть заданы с помощью условных операторов, как описано ниже. В качестве конкретного примера рассмотрим сложение двух матриц. В параллельной реализации данных CPU A может добавить все элементы с верхней половины матриц, в то время как CPU B будет прилагать все элементы из нижней половины матриц. Поскольку два процессора работают параллельно, работа над матрицами займет в 2 раза меньше времени, чем выполнение этой задачи на одном процессоре. Параллелизм данных подчеркивает распределенный (распараллеленый) характер данных, в отличие от обработки (параллелизм задач).
Большинство реальных программ находятся между параллелизмом задач и параллелизмом данных.
Пример
Программа выраженная псевдокодом, который выполняет какую-то произвольную операцию, foo , над каждым элементом в массиве d, демонстрируя параллельность данных:
if CPU = "a"
lower_limit = 1
upper_limit = round (d.length / 2)
else if CPU = "b"
lower_limit = round (d.length / 2) + 1
upper_limit = d.length
for и from lower_limit to upper_limit by 1
foo (d [i])
Если в примере выше программа выполняется на двухпроцессорной системе, среда может выполнять его следующим образом:
В системе SPMD, оба процессора будут выполнять код.
В параллельном среде, оба будут иметь доступ к d.
Механизм предусматривает нахождение в месте, где каждый процессор может создать свои копии upper_limit и lower_limit, которые являются независимыми.
Оператор if разграничивает работу процессоров. CPU A будет считывать true в if ; а CPU B будет считывать true в else if , таким образом они имеют свои собственные значения upper_limit и lower_limit.
Сейчас, оба процессора выполняют foo (d [i]), но, поскольку каждый процессор имеет разные значения границ, они работают на разных частях d одновременно, тем самым распределяют задачи между собой. Очевидно, что они будут выполнять это быстрее, чем один процессор.
Эту концепцию можно обобщить на любом количестве процессоров. Однако, когда число процессоров увеличено, полезно перестроить программу подобным путем (где cpuid является числом между 1 и количеством процессоров и действий как уникальный идентификатор для каждого процессора):
for и from cpuid to d.length by number_of_cpus
foo (d [i])
Например, на 2-процессорной системе CPU A ( cpuid 1) будет работать на нечетных значениях и CPU B ( cpuid 2) будет работать на четных значениях.
------------------------
ТРИО теплый пол отзыв
Заработок на сокращении ссылок
Earnings on reducing links
Код PHP на HTML сайты
Категория: Компьютерные советы
Комментарии |