C++ 使用OpenMP将循环划分为独特的任务

C++ 使用OpenMP将循环划分为独特的任务,c++,openmp,C++,Openmp,请原谅,如果这个问题以前已经回答过,我不知道哪些是正确的关键字 我想使用openmp并行运行大量对linux命令的调用。我需要以某种方式保证,每个工作人员都会等待命令完成,并且命令可能需要不同的时间来完成。为了简化这个问题,我试图生成命令将在其上运行的文件的名称,但是每个文件名都被生成了不止一次,但是文件名是唯一的。如何修改以下代码行以实现按文件名的唯一调用,从而使用OpenMP对命令进行唯一调用 omp_set_num_threads(8); #pragma omp paral

请原谅,如果这个问题以前已经回答过,我不知道哪些是正确的关键字

我想使用openmp并行运行大量对linux命令的调用。我需要以某种方式保证,每个工作人员都会等待命令完成,并且命令可能需要不同的时间来完成。为了简化这个问题,我试图生成命令将在其上运行的文件的名称,但是每个文件名都被生成了不止一次,但是文件名是唯一的。如何修改以下代码行以实现按文件名的唯一调用,从而使用OpenMP对命令进行唯一调用

    omp_set_num_threads(8);
    #pragma omp parallel for  private(command, dirname) shared(i_traj) schedule(dynamic)
       for(i_traj=0; i_traj<G.size(); i_traj++)
        {
   //command will contain the comand line. 
          snprintf(dirname1,sizeof(dirname1), "ID%i_Trajectory_%i",ID,G[i_traj].ID);
          dirname = string(dirname1);
          /*Initializing the trajectories*/

          cout<<"Going to: "<<G[i_traj].folder_addr<<endl;
        }
这段代码将在函数中执行,而不是在主程序中执行。是否可以使用MPICH2执行相同的操作

更新: 这个问题与我的计算机有关,而不是与代码有关,因为代码在另一台机器上正常工作。有什么建议吗

升级:

为了遵循Gilles的建议,我将代码升级如下:

#include <iostream>
#include <string>
using namespace std;
#define LARGE_NUMBER 100
double item[LARGE_NUMBER];
void process(int ID, nucleus &tr)
{
  char dirname1[40];
  string command;
  string script_folder;
  snprintf(dirname1,sizeof(dirname1), "ID%i_Trajectory_%i",ID,tr.ID);
  string dirname;
  dirname = string(dirname1);
  /*Initializing the trajectories*/
  cout<<"Running: "<<dirname<<endl;
  script_folder = "./"+ dirname;
  chdir(script_folder.c_str());
  //command = "qsub " + dirname+"_PBS"  + ".sh";                                                                                                                                                
  command = "gamess-2013 " + dirname + ".inp  01  1 ";

  printf ("Checking if processor is available...");
  if (system(NULL)) puts ("Ok");
  else exit (EXIT_FAILURE);
  if(!tr.runned)
    {
      int fail= system(command.c_str());
      tr.runned=true;
    }

  chdir("../");
  return;
}

int main() {

  #pragma omp parallel
  {
    #pragma omp single
    {
      int i;
      for (i=0; i<LARGE_NUMBER; i++)
#pragma omp task
        // i is firstprivate, item is shared                                                                                                                                                    
        process(i);
    }

  }
 return 0;
}

但保证每个文件只处理一次的问题仍然存在。我怎样才能确保每个任务都在一个唯一的文件上工作,直到命令执行完成?

对不起,我真的不明白你问的问题,也不明白它的上下文。这句话让我特别困惑:

为了简化这个问题,我试图生成命令将在其上运行的文件的名称,但是每个文件名都被生成了不止一次,但是文件名是唯一的

无论如何,所有这些都表明我的答案可能没有抓住要点。但是,我仍然可以报告您的代码片段有一个主要问题:您显式地声明了您尝试并行化的循环的索引I_traj。这没有意义,因为如果有一个变量希望在OpenMP并行循环中是私有的,那么这就是循环索引。此外,OpenMP标准明确禁止这样做。重点是我的

for的关联for循环中的循环迭代变量 或并行构造是私有的。 [...] 可能不会列出具有预定数据共享属性的变量 在数据共享属性子句中,下列情况除外。 仅针对这些例外情况,在 允许使用数据共享属性子句并重写变量的 预定的数据共享属性

下面是一个例外列表,其中未提及共享循环迭代变量


同样,我的回答可能完全没有抓住要点,但您肯定有一个问题,您最好先解决这个问题,然后再尝试深入了解。

感谢您的回答,尝试考虑您的观察结果,我编辑了问题添加代码,以更安全的方式。