C++ openmp并行循环中的调用函数
我是OpenMP新手,我有一个循环,我想与OpenMP并行。在并行循环中调用一个子例程。这是我的代码:C++ openmp并行循环中的调用函数,c++,openmp,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)
#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);
}
#pragma omp parallel for shared(dir,utilities path,frequency,solvent,Method,dispersion)private(start,file_cp2k,file_geo,file_energy)
对于(i=1;i启用OpenMP的循环执行的所有代码必须是线程安全的。您的子例程可能不是线程安全的。线程安全基本上意味着您同步对所有全局/共享对象的访问
这不是一个容易的主题,因此我建议您研究线程安全和基于互斥体的同步,以解决您的问题。使您的子例程调用顺序化。此外,调用时间可能不会像您期望的那样工作。@erip这是一个很长的子例程,我希望有几个它的实例在列出每个变量的行为时,您还应该将i
设置为私有,并将n_一致性设置为共享。但是,如果我们不知道函数Makecp2kOptInput
的功能以及它与这些变量的交互方式,我们将无法进一步帮助您。