我是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 * 已中止(核心转储)
如果我删除对子程序的调用,则没有问题。
我应该如何正确地并行化循环?
由于
答案 0 :(得分:0)
启用OpenMP的循环执行的所有代码必须线程安全。您的子例程可能不是线程安全的。线程安全本质上意味着您可以同步对所有全局/共享对象的访问。
这不是一个简单的主题,因此我建议您研究线程安全和基于互斥锁的同步,以解决您的问题。