openmp并行循环中的调用函数

时间:2016-02-08 12:15:44

标签: c++ openmp

我是OpenMP的新手,我有一个循环,我想与OpenMP并行化。在并行循环内部调用子程序。这是我的代码:

#pragma omp parallel for shared(dir,utilitiespath,frequency,solvent,Method,dispersion)  private(beginning,file_cp2k,file_geo,file_energy)
for(i=1;i<=n_conformers;i=i+1)
{
    time(&beginning);
    file_cp2k="conformer"+ QString::number(i) +".inp";
    file_geo= "conformer" +  QString::number(i) + "_geoMM.sdf";
    file_energy=dir+ "conformer" + QString::number(i)  + "_enerSE";
    cout<<"loop "<<i<<" time "<<beginning<< endl;
    int n_atom=Makecp2kOptInput(file_geo, file_cp2k, dir,utilitiespath, frequency, solvent, Method,dispersion);
}

我收到以下错误:

  

*`./ChemAliveMolOpt'错误:双重免费或损坏   (fasttop):0x00000000018d7c00 * 已中止(核心转储)

如果我删除对子程序的调用,则没有问题。

我应该如何正确地并行化循环?

由于

1 个答案:

答案 0 :(得分:0)

启用OpenMP的循环执行的所有代码必须线程安全。您的子例程可能不是线程安全的。线程安全本质上意味着您可以同步对所有全局/共享对象的访问。

这不是一个简单的主题,因此我建议您研究线程安全和基于互斥锁的同步,以解决您的问题。