2015-10-14 119 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