假设由最好你的意思是最快,通常的做法是分A
和B
成大块,生成一个单独的线程来处理每一个这些并行块,并等待所有的线程完成他们的任务。
用于此类计算的块的最佳数量很可能是您计算机上的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()
其中每个线程,具备startIndex
和size
,计算:
for (i = startIndex to startIndex + size) {
C[i] = Math.sqrt(A[i] * B[i])
}
另一种方法是有一个线程池,并给那些线程单指数共享队列1, 2, ... n
。每次迭代中的每个线程都会轮询顶部索引(让它为i
)并计算C[i]
。只要队列为空,工作就完成了。这里的问题是,您需要额外的同步机制,以确保每个索引仅由一个线程处理。对于一些简单的任务(比如你的),这样的机制可能比实际计算消耗更多的资源,但是对于相对长时间运行的任务来说,它的工作状况非常好
当您将初始任务分解为块时,为池中的每个线程提供其自己的块,但是当线程完成其块时,会开始从其他线程中“窃取”任务为了不坐闲。在许多实际任务中,它比以前的任何一种方法都有更好的结果。
语言?系统? –
现在没有任何特定的语言。只是想知道一种方法。 – prime
只是关于符号的一个附注:十字形“×”通常用于表示叉积,但在这里它似乎指的是点积,它通常用中心点“·”表示。 – MicroVirus