2015-02-07 112 views
0

我希望你能幫我解決一個C++/mpi程序中打印稀疏矩陣的問題。MPI:當處理器數量增加時,輸出時間增加

問題:我需要在與MPI並行的程序中的.txt文件中打印一個稀疏矩陣作爲3-ples(x,y,v_xy)的列表。由於我是MPI的新手,我決定不處理庫提供的並行IO指令,並讓主處理器(在我的情況下爲0)打印輸出。然而,用於印刷基質的時間增加時,我增加處理器數量:

  • 1處理器:11,7秒
  • 2處理器:26,4秒
  • 4處理器:25,4秒

我已經驗證了三種情況下的輸出是完全一樣的。這裏是代碼的相關部分:

if (rank == 0) 
{  
    sw.start(); 

    std::ofstream ofs_output(output_file); 
    targets.print(ofs_output); 
    ofs_output.close(); 

    sw.stop(); 
    time_output = sw.get_duration(); 
    std::cout << time_output << std::endl; 
} 

我的秒錶SW使用gettimeofday函數測量掛鐘時間。 爲目標矩陣print方法如下:

void sparse_matrix::print(std::ofstream &ofs) 
{ 
    int temp_row; 
    for (const_iterator iter_row = _matrix.begin(); iter_row != _matrix.end(); ++iter_row) 
    { 
     temp_row = (*iter_row).get_key(); 
     for (value_type::const_iterator iter_col = (*iter_row).get_value().begin(); 
     iter_col != (*iter_row).get_value().end(); ++iter_col) 
     { 
      ofs << temp_row << "," << (*iter_col).get_key() << "," << (*iter_col).get_value() << std::endl; 
     } 
    } 
} 

我不明白是什麼原因造成的放緩,因爲只有處理器0時的輸出,這是程序的最後一個操作:所有其他處理器在處理器0打印輸出時完成。你有什麼主意嗎?

+0

這些實際上是三個不同的機器還是你假裝有三個處理器在一起測試代碼? – stefan 2015-02-07 11:44:55

+0

@stefan:我使用的是i7四核處理器(戴爾XPS 15)。我忘了提及我在Oracle Linux virtualbox上執行的代碼,我在該設置中爲其分配了4個處理器。由於只有處理器0執行打印指令,我無法弄清楚打印執行時間與處理器數量的依賴關係。 – 2015-02-07 13:00:47

+0

在您的虛擬機上,切換到多個處理器會產生開銷,從而降低系統性能。因此您的測量經驗的條件是不相關的!順便說一句,gettimeofday()不是衡量性能的最佳函數(請參閱標題「Notes」下的http://linux.die.net/man/2/gettimeofday)。 – Christophe 2015-02-07 15:24:46

回答

0

那麼,我終於明白是什麼導致了這個問題。在Linux虛擬機上運行我的MPI並行程序,在增加使用的內核數量時,大大增加了在.txt文件中打印大量數據的時間。該問題是由虛擬機引起的,使用MPI時該虛擬機的行爲不正確。我在一臺物理8核機器上測試了相同的程序,打印輸出的時間不會隨着使用的內核數量而增加。