C++ 使用OpenMP将循环划分为独特的任务
请原谅,如果这个问题以前已经回答过,我不知道哪些是正确的关键字 我想使用openmp并行运行大量对linux命令的调用。我需要以某种方式保证,每个工作人员都会等待命令完成,并且命令可能需要不同的时间来完成。为了简化这个问题,我试图生成命令将在其上运行的文件的名称,但是每个文件名都被生成了不止一次,但是文件名是唯一的。如何修改以下代码行以实现按文件名的唯一调用,从而使用OpenMP对命令进行唯一调用C++ 使用OpenMP将循环划分为独特的任务,c++,openmp,C++,Openmp,请原谅,如果这个问题以前已经回答过,我不知道哪些是正确的关键字 我想使用openmp并行运行大量对linux命令的调用。我需要以某种方式保证,每个工作人员都会等待命令完成,并且命令可能需要不同的时间来完成。为了简化这个问题,我试图生成命令将在其上运行的文件的名称,但是每个文件名都被生成了不止一次,但是文件名是唯一的。如何修改以下代码行以实现按文件名的唯一调用,从而使用OpenMP对命令进行唯一调用 omp_set_num_threads(8); #pragma omp paral
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循环中的循环迭代变量 或并行构造是私有的。 [...] 可能不会列出具有预定数据共享属性的变量 在数据共享属性子句中,下列情况除外。 仅针对这些例外情况,在 允许使用数据共享属性子句并重写变量的 预定的数据共享属性 下面是一个例外列表,其中未提及共享循环迭代变量
同样,我的回答可能完全没有抓住要点,但您肯定有一个问题,您最好先解决这个问题,然后再尝试深入了解。感谢您的回答,尝试考虑您的观察结果,我编辑了问题添加代码,以更安全的方式。