2015-10-14 147 views
0

到目前爲止,我只使用OpenMP並行化C++中的循環。但是,我想知道我是否可以執行其他不是用於並行循環的代碼行。非for循環的OpenMP並行化

void minimization(int *a, int *x) { 
// this part of the code is dependent of other library. 
} 

void checkForNaN(int *a){ 
// check nan points 
} 

int main() { 
    // read data 
    minimization (a,b); 
    checkForNaN(x); 
} 

考慮樣品片段上方,由此minimization(,)checkForNaN()是獨立的也就是任一個的結果不影響其他一次。是否可以並行化?

我想是這樣的:

int main() { 
     // read data 
#pragma omp parallel 
    { 
     minimization (a,b); 
     checkForNaN(x); 
    } 
} 

是否看起來是正確的?

回答

4

這就是OMP節將用於:)

int main() { 
    #pragma omp parallel sections 
    { 
     #pragma omp section 
     { 
      minimization(a,b); 
     } 

     #pragma omp section 
     { 
      checkForNaN(x); 
     } 
    } 
} 
+1

您還可以使用OpenMP的任務來達到同樣的目標函數(#pragma OMP任務)。有關於任務和部分之間的差異很好的討論http://stackoverflow.com/questions/13788638/difference-between-section-and-task-openmp – Harald

1

不,它看起來並不正確。它會在您擁有的所有線程中執行minimization(a,b);checkForNaN(x);

相反,這會做並行:

int main() { 
    // read data 
    #pragma omp parallel sections 
    { 
    #pragma omp section 
    { 
     minimization (a,b); 
    } 
    #pragma omp section 
    { 
     checkForNaN(x); 
    } 
    } 
} 
+0

我不知道爲什麼你一直髮布完全相同的答案我今天約1分鐘後發表的帖子:p ... – Samidamaru

+0

這個答案不完全一樣。 @kcc__的代碼的作用是被添加的。 – MikeCAT