2012-04-12 80 views
0

如果我有這樣的OpenMP和功能

int main(){ 
.... 

for (i=0; i< N; i++) 
{ 
    /*Do some calculations*/ 
    for (j=0; j<M; j++) 
    { 
    /*Do more calculations*/ 
    compute_x(some pointers as args); 
    } 
    compute_y(some pointer as args); 
} 
... 

return value; 
} 

and 

void compute_x(some pointers as args) 
{ 
    /* some calculations*/ 
    for (h=0; h<COUNT; h++) 
    { 
    ... 
    } 
} 
} 

和compute_y(一環)是相似的。

我的問題是,如果我在並行使用OpenMP指令的主要外環,

#pragma omp parallel for schedule (runtime) private (...) 
for (i=0; i< N; i++) 
{ 
... 
} 

什麼將是功能compute_x()compute_y()的行爲?據我瞭解,它們將由每個線程執行,因此compute_x()中的for循環將由每個線程從0執行到COUNT。

如果這是正確的,我還能做什麼來分擔工作負荷也在函數compute_x() for循環(假設沒有數據依賴性)。我的第一個猜測是使函數compute_x()和compute_y()內聯,但函數非常大,並且他們還調用其他函數,幸運的是它們也可以並行執行。

+0

你的問題已經很複雜,所以我刪除了關於內聯的問題。請在單獨的帖子中提問(可以用歷史記錄恢復它) – CharlesB 2012-04-12 15:59:05

回答

1

如果您some pointers as args是爲每個線程(每個i不同)不同,或者它們是否與const改性劑,這是沒有的線程可以通過指針修改的內容,然後無意外會發生。

不好的一面是,當你的不同線程共享相同的指針並同時寫/讀它們指向的數據時,你可能會得到一個不可預測的結果。

2

如果外循環有足夠的迭代來保持所有內核忙,那麼沒有理由將並行化擴展到內循環。這隻會創建更多不必要的線程。