2015-11-06 52 views
0

請原諒我,如果這個問題已經回答過了獨特的任務,我想不通這是正確的關鍵字。分區循環到使用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; 
} 

但是每個文件只處理一次保障的問題仍然存在。我怎樣才能確保每個任務在獨特的文件上工作,等待命令執行完成?

回答

0

很抱歉,但我真的不明白無論你問的問題,也不是它的背景。這句話特別困惑我很多:

爲了簡化這個問題,我試圖生成命令將運行的文件的名稱,但每個文件名已被多次生成,但名稱該文件是唯一的。

反正,所有的說,我的答案很可能只是錯過了這一點。不過,我仍然可以報告你的代碼段中的一個重大問題:你明確聲明shared索引您嘗試parallelise循環i_traj。這是沒有意義的,因爲如果你想在OpenMP並行循環private一個變量,這是循環索引。此外,OpenMP標準明確禁止它section 2.14.1.1。 (重點是礦)

循環迭代變量(多個)在相關聯的for循環的一個(或多個)用於 或平行於構建體(是)私人

具有預定數據共享屬性的變量在數據共享屬性子句中可能未列出 ,下面列出的情況除外。 僅對於這些例外,列出 數據共享屬性子句中的預定變量被允許並覆蓋變量的 預定數據共享屬性。

遵循異常的列表,其中使shared未提到的「循環迭代變量(多個)」。

所以,我的答案可能完全錯過了這一點,但你肯定有一個問題,你最好先解決,然後再嘗試深入。

+0

感謝您的回答,試圖考慮您的觀察結果,我編輯了添加代碼的問題,以獲得更安全的方法。 – user3116936