請原諒我,如果這個問題已經回答過了獨特的任務,我想不通這是正確的關鍵字。分區循環到使用OpenMP
我想並聯了很多電話來使用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可以做同樣的事情嗎?
更新: 問題與我的電腦有關,而與代碼無關,因爲代碼可以正常使用另一臺機器。任何建議?
升級:
試圖按照吉爾的建議步驟,我升級了代碼如下:
#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;
}
但是每個文件只處理一次保障的問題仍然存在。我怎樣才能確保每個任務在獨特的文件上工作,等待命令執行完成?
感謝您的回答,試圖考慮您的觀察結果,我編輯了添加代碼的問題,以獲得更安全的方法。 – user3116936