2013-10-04 344 views
1

我需要一些OpenMP幫助。如果一個線程在for循環中結束,它可能會幫助另一個線程,將它分開嗎?我有一個循環在休息的地方,並且線程不會同時結束,所以有很多工作的線程,以及其他完成的線程。 (所以有沒有使用的核心)。我在corei7上運行我的程序,看起來OpenMP將循環分成8個線程。但是一段時間當一個線程完成這項工作後,利用率開始下降。OpenMP優化調度for循環

#pragma omp parallel for 
for(i = 0; i < Vector.size(); i++) { 
    for(j = 0; j < othervector.size(); j++) { 
     {some code} 
     if(sth is true) break; 
    } 
} 

謝謝。

回答

2

for循環中循環迭代的默認分區/ SCHEDULE取決於實現。在你的情況下,當使用omp parallel for時,默認的shedule可能是STATIC,這意味着根據你的向量的大小,每個線程被分配一個固定的數據塊。由於顯然工作負載不能通過靜態分配來平衡,因此您應該查看DYNAMIC, GUIDED and RUNTIME子句,看看它是否有助於您重新建立(虛擬)內核的高利用率。根據塊的大小,這當然會造成額外的開銷,但與核心在靜態調度時閒置的時間相比,這可能變得微不足道。

要回答最初的問題:我不認爲你可以告訴一個線程繼續另一個工作。當工作被分配時,每個線程都必須自己處理它。這是我會嘗試的。

#define CHUNKSIZE 100 

#pragma omp parallel for schedule(dynamic,chunk) nowait 
for(i = 0; i < Vector.size(); i++) { 
    for(j = 0; j < othervector.size(); j++) { 
     {some code} 
     if(sth is true) break; 
    } 
} 

其實里斯託·利維前一段時間寫了一個非常好的回答了類似的question