2010-11-23 299 views
12

我有兩個類似的代碼。OpenMP中的靜態和動態調度之間的區別C

首先

#pragma omp parallel for shared(g) private(i) schedule(dynamic, 1) 
for(i = (*g).actualNumberOfChromosomes; i < (*g).maxNumberOfChromosomes; i++) 
{ 
    AddCrossoverChromosome(g, i); // it doesnt change actualNumberOfChromosomes 
    #pragma omp atomic 
    (*g).actualNumberOfChromosomes++; 
} 

#pragma omp parallel for shared(g) private(i) schedule(static, 1) 
for(i = (*g).actualNumberOfChromosomes; i < (*g).maxNumberOfChromosomes; i++) 
{ 
    AddCrossoverChromosome(g, i); // it doesnt change actualNumberOfChromosomes 
    #pragma omp atomic 
    (*g).actualNumberOfChromosomes++; 
} 

唯一的區別是在第一行。第一個代碼工作正常,但第二個崩潰。爲什麼?

問題在actualNumberOfChromosomes的某個地方,但我想明白爲什麼,而不僅僅是解決這個問題。我可以通過創建加法變量p並將actualNumberOfChromosomes賦值給它並更改循環以便i等於p來解決此問題。

+0

你能否詳細解釋爲什麼第二個程序崩潰?指針g是否已損壞?而且,當它墜毀?你可以打印出我的價值。我需要更多的信息來了解這個問題。您可以打印出每個迭代和每個線程的一些變量。 – minjang 2010-11-28 11:22:42

回答

13

問題是,此代碼不符合OpenMP,不符合規範的程序具有「未指定」行爲。如果你看一下OpenMP API的V3.0規範,部分2.5.1循環結構,說明下它指出:

每個相關的循環迭代次數是進入到最外面的 循環之前計算的。如果執行任何關聯的循環更改用於計算任何迭代計數的任何值,則行爲未指定。

時間表類型的靜態和動態之間最大的區別,就是用靜態的,塊可以稍微計算和編譯過程中定線,而動態它在運行時完成(需要更多的鎖定)。

13

static計劃類型和dynamic計劃類型之間的區別是,static的塊可以預先計算以及決定如何計劃編制過程本身線程,而與dynamic同樣的事情做在運行期間。

隨着dynamic使用,它涉及到像死鎖處理機制,負載處理等

你可以在一些更多的信息有些複雜的機制:http://openmp.blogspot.com

相關問題