Многопоточные операторы - PullRequest
1 голос
/ 14 ноября 2010

Как операторы +, -, *, /, и т. Д ... могут быть многопоточными?

В этой статье на языке IDL утверждается, что все операторы используют 'пул потоков 'для увеличения скорости выполнения.

Как получается, что можно использовать несколько потоков для выполнения оператора, такого как' b = a - a '(как на странице 42) статьи?

Может кто-нибудь объяснить это?(В настоящее время я считаю, что IDL - полный грабеж, но, может быть, кто-то может изменить свое мнение.)

(Действительно, это относится к любому языку, как оператор может выполнять многопоточность на любом языке программирования?)

Ответы [ 3 ]

1 голос
/ 14 ноября 2010

Я думаю, важно также учитывать, что не все операции с + созданы равными. Например, если вы используете какую-то библиотеку bignum, вы можете разделить большое число на более мелкие части, сделать отдельные суммы целых чисел (параллельно) и перенести их. В любом случае, это не будет одноцикловое сложение целых чисел. Умножение включает в себя пару шагов, а деление - много шагов.

В приведенном примере плавающие точки (с плавающей точкой нетривиальный процесс добавления ) имели «4,2 миллиона точек данных»: я сомневаюсь, что они хранили это в небольшом 32-битном регистре. «Простая» операция сложения внезапно стала огромным итеративным процессом ... или, может быть, чем-то намного более быстрым, если они могут делать это параллельно.

Хотя простые операции с маленькими целыми числами могут не стоить многопоточности, стоит отметить, что B=A+A, хотя и выглядит простым, на самом деле может привести ко многим вычислениям. 1 строка кода не обязательно означает 1 операцию.

1 голос
/ 14 ноября 2010

Я не знаю о IDL, но, конечно, это возможно, если у вас есть типы более высокого уровня.Например, вы можете удобно распараллеливать операции с массивами.Предположительно, это то, что означает «4200000 pts», хотя кто-то решил сделать графики действительно трудными для чтения.

Для сравнения, в C (с возможным распараллеливанием OpenMP) у вас может быть что-то вроде:

#pragma omp parallel for
for (int i=0; i<sizeof(B)/sizeof(B[0]); i++) {
    B[i]-=A[i];
}

В языке более высокого уровня, таком как NumPy, Matlab или C ++, это может быть просто B=B-A.Все это говорит, B=A-A звучит для меня смущенно, как B=0.

Вы просили параллельный оператор на любимом языке?Вот немного из Haskell:

import Control.Parallel

pmap _ [] = []
pmap f (x:xs) =
  let rest=pmap f xs
  in rest `par` (f x):rest

parOp op a b = pmap (uncurry op) (zip a b)

parAdd = parOp (+)

main = do
  putStrLn$show ([0..300] `parAdd` [500..800])

Да, это все еще цикл.Множество операций (не операторов) является ключом к этому типу параллелизма.

0 голосов
/ 14 ноября 2010

Примитивные операции над матрицами, массивами и т. Д. Можно распараллелить - прокрутите страницу 41 и вы увидите:

Для графиков сравнения системы результаты представлены для массивов из 4,2 миллиона элементов.

Редактировать: Предположим, у вас есть массив A = [1, 2, 3, 4, 5, 6].

Расчет B = A - A = [0, 0, 0, 0, 0, 0] включает в себя 6 операций вычитания (1-1, 2-2 и т. Д.).

  • с одним ЦП, независимо от количества потоков, вычитания должны выполняться последовательно.
  • с несколькими процессорами, но только с одним потоком, вычитания также выполняются последовательно - это по определению потока.
  • несколько процессоров, несколько потоков - вычитания могут быть разделены между потоками / процессорами и, таким образом, происходят одновременно (до количества доступных процессоров).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...