2016-08-13 105 views
1

假设我们有两个向量A =(ai)和B =(bi),每个向量的大小为n,我们必须计算一个新的向量C = CI)为=√(×)为(I = 1,...,N)使用嵌套并行计算c =√(a×b)

主要问题:什么是计算并行CI的最佳方式(使用嵌套并行,即,使用同步和产卵)。

我觉得下面的理解是关于计算

for (i = 1 to n) { 
    C[i] = Math.sqrt(A[i] * B[i]); 
} 

正确的,是有什么办法可以使用并行for循环计算并行C

如果是这样,我认为这种方法会有如下:

parallel for (i = 1 to n) { 
    C[i] = Math.sqrt(A[i] * B[i]); 
} 

它是正确的吗?

+0

语言?系统? –

+0

现在没有任何特定的语言。只是想知道一种方法。 – prime

+0

只是关于符号的一个附注:十字形“×”通常用于表示叉积,但在这里它似乎指的是点积,它通常用中心点“·”表示。 – MicroVirus

回答

2

假设由最好你的意思是最快,通常的做法是分AB成大块,生成一个单独的线程来处理每一个这些并行块,并等待所有的线程完成他们的任务。

用于此类计算的块的最佳数量很可能是您计算机上的CPU核心数量。因此,伪代码看起来像:

chunkSize = ceiling(n/numberOfCPUs) 
for (t = 1 to numberOfCPUs) { 
    startIndex = (t - 1) * chunkSize + 1 
    size = min(chunkSize, C.size - startIndex + 1) 
    threads.add(Thread.spawn(startIndex, size)) 
} 
threads.join() 

其中每个线程,具备startIndexsize,计算:

for (i = startIndex to startIndex + size) { 
    C[i] = Math.sqrt(A[i] * B[i]) 
} 

另一种方法是有一个线程池,并给那些线程单指数共享队列1, 2, ... n。每次迭代中的每个线程都会轮询顶部索引(让它为i)并计算C[i]。只要队列为空,工作就完成了。这里的问题是,您需要额外的同步机制,以确保每个索引仅由一个线程处理。对于一些简单的任务(比如你的),这样的机制可能比实际计算消耗更多的资源,但是对于相对长时间运行的任务来说,它的工作状况非常好

当您将初始任务分解为块时,为池中的每个线程提供其自己的块,但是当线程完成其块时,会开始从其他线程中“窃取”任务为了不坐闲。在许多实际任务中,它比以前的任何一种方法都有更好的结果。

+0

有块是第一选择。对此很好的解释。想看看有没有其他办法。 – prime

+1

是的,还有其他人,我添加了几个最常见的。 –

+0

是的。有趣。感谢您的洞察力:) – prime

相关问题