2014-02-13 42 views
-1

我無法訪問或打印嵌套for循環中的任何數據。這是我第一次寫了一個MPI程序,所有例子都沒有顯示比Hello World更復雜的東西。我究竟做錯了什麼?無法在MPI中訪問嵌套for循環Bcast

void assignStarsToClusters(double *stars, double *clusters, int *azimuth) 
{ 
ostringstream oss; 

oss.str(""); 
oss.clear(); 

//double start = MPI_Wtime(); 

// Assign a star to the closest cluster 
double smallDistance; 
double tmpDistance; 
int indice = 0; 

MPI_Barrier(MPI_COMM_WORLD); 

MPI_Bcast(azimuth /*the data we're broadcasting*/, 
      NUMOFLINES /*the data size */, 
      MPI_INT /*the data type */, 
      0   /*the process we're broadcasting from */, 
      MPI_COMM_WORLD); 
MPI_Bcast(stars /*the data we're broadcasting*/, 
      NUMOFSTARCOORD /*the data size */, 
      MPI_DOUBLE /*the data type */, 
      0   /*the process we're broadcasting from */, 
      MPI_COMM_WORLD); 
MPI_Bcast(clusters /*the data we're broadcasting*/, 
      NUMOFCLUST /*the data size */, 
      MPI_DOUBLE /*the data type */, 
      0   /*the process we're broadcasting from */, 
      MPI_COMM_WORLD); 
MPI_Bcast(&NUMOFCLUST /*the data we're broadcasting*/, 
      1    /*the data size */, 
      MPI_DOUBLE /*the data type */, 
      0   /*the process we're broadcasting from */, 
      MPI_COMM_WORLD);  
MPI_Bcast(&NUMOFSTARCOORD /*the data we're broadcasting*/, 
      1    /*the data size */, 
      MPI_DOUBLE /*the data type */, 
      0   /*the process we're broadcasting from */, 
      MPI_COMM_WORLD); 

int sx = NUMOFSTARCOORD/comm_sz; 
int s_lower = my_rank * sx; 
int s_upper = s_lower + sx; 


for(int a = my_rank; a <= comm_sz; a++) 
{ 
    for(int i = s_lower; i <= s_upper; i+=3) 
    { 
     smallDistance = sqrt(sqr(stars[i] - clusters[0]) + sqr(stars[i+1] - clusters[1]) + sqr(stars[i+2] - clusters[2])); 

     indice = 0; 

     for(int j = 3; j <= (NUMOFCLUST * 3); j+=3) 
     { 
      tmpDistance = sqrt(sqr(stars[i] - clusters[j]) + sqr(stars[i+1] - clusters[j+1]) + sqr(stars[i+2] - clusters[j+2])); 

      oss << " " << j;   

      if(tmpDistance < smallDistance) 
      { 
       smallDistance = tmpDistance; 
       indice = j; 
      }   
     } 
     azimuth[i/3] = indice/3; 

     //oss << " " << indice; 
    } 
} 
    MPI_Barrier(MPI_COMM_WORLD); 

    // cout << oss.str() << endl; 

//oss.str(""); 
//oss.clear(); 
//if(my_rank == 0) 
//{ 
    //for (int i = 0; i < NUMOFLINES; i++) { 
    // oss << " " << azimuth[i]; 
    //} 
//} 


cout << oss.str() << endl; 

//cout << "Total Time: " << MPI_Wtime() - start << endl; 

} 
+0

你不能指望我們在SO教你MPI。只需搜索「MPI教程」,並從那裏開始:有更多的例子「hello world」。 – Sigismondo

+0

我已經做了一個你好的世界,並沒有幫助在這種情況下。簡單的MPI程序不會幫助您跳轉到真正的代碼。有一點幫助讓我開始會很好。我理解這些概念,我只需要我的第一個程序的一些幫助。 – SINGULARITY

+0

如果不知道'azimuth','cluster','NUMOFSTARCOORD'是否被刪除,那麼很難告訴你什麼是錯誤的。下面是一個MPI_Bcast()的例子:http://mpi.deino.net/mpi_functions/MPI_Bcast.html – francis

回答

0

我會告訴你我在你的MPI代碼中看到了什麼錯誤。

  1. MPI_Barrier():主要是從來不需要:MPI_Bcast()同步是隱含的 - 當你訂購I/O輸出到標準輸出時需要的東西外同步,例如需要的障礙。

  2. 這個循環:

    for(int a = my_rank; a <= comm_sz; a++) 
    

    目前尚不清楚的意圖。我希望my_rankcomm_sz已被正確初始化。你確定他們是?你是否正確地使用mpirun運行你的代碼?但最重要的是:我不知道爲什麼,但我覺得你認爲這個循環是並行的。在循環中不使用a循環變量(它的名字是一個可怕的選擇)。如果我的直覺是正確的......那麼這不是MPI的工作原理。另一方面,如果你的alogrithm(完全不清楚)是正確的,它的不平衡,因爲不同的MPI任務將執行不同次數的迭代。所以你的代碼將會以最慢的速度執行,這是my_rank == 0的任務。

  3. 我的負面評論的原因是,你說「這是我第一次寫過MPI程序」,而你之前只嘗試過「hello world」。我強烈建議你嘗試一些比較典型的例子:分配金額,鬼細胞......然後,當你擁有它如何與簡單的測試情況下工作更好的主意,你去和開始使用你自己的問題。

  4. 你應該開始在這裏發佈一個工作代碼,從實際問題中提取,如果太大而不實際。請參閱here,特別是here:您將看到,試圖解釋它,即使在發佈之前,您也會澄清自己。 MPI_Bcast()的 - 帖子的標題 - 看起來非常正確:如果你不想用一個並行調試器開始,你應該開始打印它們以開始調試代碼(這不會是一個並行調試器的開始(這不會是一個不好的主意)......但似乎你還沒有嘗試過。我將開始第一MPI_Bcast()後,加入這一行:

    cout << my_rank << ": azimuth[0]="<< azimuth[0] << endl; 
    

希望它更清楚我的批評爲什麼。