Openmp函数调用和嵌套循环

时间:2015-07-03 16:50:36

标签: openmp

我试图用openMP并行化我的代码,它有函数调用,嵌套循环和依赖......我怎么能这样做?

for (int i = 2; i <=1001; i++) {

   for ( k=(i-1)*600;k<i*600;k++){
    v_verlet(dt);

    for(int s=0;s<2;s++)
    array[k-600][s]=v[50][s]; 

    sum1+=total_energy();
    sum2+=temperature();
    if (k % up_interval == 0) {
        updatepairlist();
        updatePairSeparations();
                               }
    if( k%15000==0)
     {
      sum1/=15000;
      sum2/=15000;

1 个答案:

答案 0 :(得分:0)

这可能取决于您要执行哪种类型的并行化(任务分解,数据分解......),但这不是唯一的事情。要记住很多事情。这一切都取决于你编写代码的方式,你想要实现的目标等等。

在这段代码中,我们可以使用一个collapse子句来封装n个循环的迭代。如果我们关注如何将任务分配给线程,我们还可以决定是静态还是动态地分配它们(我们之前是否知道我们将使用的线程数量以及线程间的工作负载分配?那么,分配任务会更有效吗?在编译时间和避免执行期间的任务分配?)。那么用一个原子句来保护对sum1和sum2或其他变量的访问(这是否必要,取决于原始变量是否被所有线程使用)?

看看第三个for循环,假设你有一个非常大的向量并且你多次访问它,你可以考虑通过使用填充策略来避免错误共享,这可以通过转换向量来确保更少的缓存未命中和错过惩罚一个二维数组,它适合我们缓存中一行的大小。

我建议您通过在互联网上搜索来尝试更多示例。

希望这有帮助,玩得开心!