2010-11-14 95 views
1

运算符+, - ,*,/等等如何能被多线程化?多线程操作符

在这个关于语言IDL的paper上,它声称所有操作符都使用'线程池'来提高执行速度。

它是如何使用多个线程来执行语句,比如'b = a - a'(如第42页)?

有人可以解释这一点吗? (我目前考虑IDL共骗人货,但也许有人可以改变我的主意。)

(真正适用于任何语言,如何操作员在任何计算机编程语言mulithreaded?)

回答

1

我不不了解IDL,但是如果你有更高级别的类型,这当然是可能的。例如,你可以方便地并行数组操作。据推测,这就是“4200000点”所指的,尽管有人决定让这些图表真的难以阅读。

为了进行比较,在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

这不是一个平行的循环,而不是所谓的多线程操作符? – Skeptic 2010-11-14 15:06:51

+0

没错。这也在本文中提到:**对于系统 比较图,结果报告为420万个元素的数组。**关于上述评论:您可以始终提供运算符的多线程重载。 – 2010-11-14 15:08:51

+0

运算符的多线程重载? Hrm ...即使你指的是对非整型类型的操作符,也似乎不可能创建一个多线程操作符。请用你最喜欢的语言举个例子。 – Skeptic 2010-11-14 15:19:03

0

的矩阵,阵列等基本操作可以并行化 - 向上滚动到第41页,你会发现:

对于系统比较图,结果被报道的420万个元素数组。

编辑:假设你有一个数组A = [1, 2, 3, 4, 5, 6]

计算B = A - A = [0, 0, 0, 0, 0, 0]涉及6个减法操作(1-1,2-2等)。

  • 使用单个CPU,无论线程数量多少,减法必须串联执行。
  • 有多个CPU但只有一个线程,减法也是按照一系列的顺序执行 - 这就是线程的定义。
  • 多个CPU,多个线程 - 减法可以在线程/ CPU之间分配,因此可以同时发生(最多可用CPU数量)。
+0

这似乎仍然归结为并行循环... – Skeptic 2010-11-14 15:28:01

+0

...这也可以使用线程池执行。假设你有A = [1,2,3,4,5,6];计算B(= A - A = [0,0,0,0,0,0])需要6次操作,但两个线程之间的分割将花费一半的时间 - 每个线程处理数组的一半并且它们同时运行(假设你至少有2个CPU)。我误解你的问题吗? – SimonJ 2010-11-14 15:33:33

1

我认为重要的是还要考虑到并非所有的操作都是相同的。例如,如果您使用某种类型的bignum库,则可能能够将大量数据分成较小的部分,完成不同数量的整数(并行),然后结转。无论如何,它不会成为整数的单周期添加。乘法涉及几个步骤,并划分,很多步骤。

在给出的例子中,浮点数(浮点数意味着a non-trivial adding process)具有“420万个数据点”:我怀疑它们将这些数据存储在一个小的32位寄存器中。 添加的“简单”操作突然变成了一个巨大的迭代过程......或者如果他们能够并行执行,速度可能会快很多。

虽然使用小整数的简单操作可能不值得通过,但值得注意的是B=A+A尽管看起来很简单,但实际上可能会导致很多计算。 1行代码不一定意味着1次操作。