假設由最好你的意思是最快,通常的做法是分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