2016-08-27 117 views
1

我想有一個並行區域裏面它首先有一個並行的,然後一個函數調用一個並行的內部和最後一個並行的。從一個並行for循環OpenMP調用並行函數

一個簡單的例子可能是這個

#pragma parallel 
{ 
    #pragma omp for 
    for(int i=0;i<1000;i++) 
    position[i]+=velocity[i]; 

    calculateAccelerationForAll(); 

    #pragma omp for 
    for(int i=0;i<1000;i++) 
    velocity[i]+=acceleration[i]; 
} 

calculateAccelerationForAll() 
{ 
    #pragma parallel omp for 
    for(int i=0;i<1000;i++) 
    for(int j=0;j<1000;j++) 
     acceleration[i]=docalculation 
} 

的問題,這裏是,我希望將現有的線程跳過去到calculateAccelerationForAll並執行for循環出現,而不是三個獨立的並行區域。我可以確保只有第一個線程實際調用該函數,並且在函數調用後有一個障礙,但只有該線程在該函數內部執行for循環。

問題是,如果我的假設,即將第一個和最後一個循環放在它們自己的並行區域並進行函數調用時也有其自己的區域,那麼效率低下,是錯誤的......或者如果它是正確的,然後我怎麼才能讓一個區域線程一路貫穿。

可能會補充一點,如果我只是將函數的內容放在主要平行區域內,在兩個現有的循環之間,那麼這不是問題。問題(至少對我來說)是我必須使用函數調用,然後再並行運行。

回答

2

它似乎幫助打印出問題。 答案顯然是改變編譯從#pragma parallel for#pragma for 功能 這使得對於循環使用來自現有現有線程並行調用部分,它完美的作品。