2016-08-13 68 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

相關問題