2011-12-01 23 views
4

這是關於我剛纔的問題:D concurrent writing to bufferd taskpool等待,直到所有的任務都做了

說你有一段代碼,包括2個連續的代碼塊A和B,其中B依賴於A.此在編程中很常見。 A和B兩者由一個循環,其中每一次迭代可以並行運行的:當A完成時,才能執行

double[] array = [ ... ]; // has N elements 

// A 
for (int i = 0; i < N; i++) 
{ 
    job1(array[i]); // new task 
} 

// wait for all job1's to be done 

// B 
for (int i = 0; i < N; i++) 
{ 
    job2(array[i]); // new task 
} 

乙。如何在執行B之前等到A的所有任務完成?

回答

6

我假設你使用std.parallelism?我寫了std.parallelism,所以我會讓你參與設計決策。在std.parallelism的某些beta中實際上有一個join函數。它等到所有任務完成並關閉任務池。我刪除它,因爲我意識到它是無用的。

的原因是,如果你手工創建一組的O(N)task對象遍歷一定範圍內,你濫用庫。你應該使用一個並行的foreach循環,它會在控制釋放回調用線程之前自動加入。你的榜樣將成爲:

foreach(ref elem; parallel(array)) { 
    job1(elem); 
} 

foreach(ref elem; parallel(array)) { 
    job2(elem); 
} 

在這種情況下job1job2因爲並行foreach循環已經在使用足夠的任務,以充分利用所有的CPU內核不應該開始新的任務。

+0

我可以看到你的觀點。然而,如果我們想用foreach迭代那些並不那麼簡單的事情呢?如果你想迭代奇數指數呢?我需要建立一個新的數組,以便我可以使用foreach嗎?有scopedTask這幾乎做我所需要的,除了它的作用域的迭代,而不是作爲一個整體的循環... –

+4

@Daevius:如果你想迭代奇數指數,你可以使用std.range.stride或foreach( i; parallel(std.range.iota(1,array.length,2))。std.parallelism是在假設std.algorithm和std.range中的高階範圍提供了這種靈活性的情況下創建的必須在std.parallelism的設計中明確地規劃 – dsimcha

+1

確實,由於範圍創建的許多功能,這是一個整潔的設計。使用我的二維FFT算法在四分之一時,速度提高了約200%核心:),謝謝。順便說一句,真的不是真的與希臘字母Iota有關嗎? ^^ –

相關問題