2016-04-06 54 views
0

我正在研究MPI中的並行矩陣 - 矩陣乘法器。我有計算部分工作,但我也想計算CPU時間。由於看起來有些進程報告的開始和結束時間爲0,並且對於應該在第二個(小型矩陣)下執行的任務,程序報告了1000多秒的CPU時間(即使我知道它運行了在觀察的第二位)。這是我目前正在做的:使用MPI計算CPU時間

#include <time.h> 
#include "mpi.h" 
// other includes 
int main() 
{ 
    int start, end, min_start, min_end; 
    if (rank == 0) 
    { 
     // setup stuff 

     start = clock(); 
     MPI_Reduce(&min_start, &start, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD); 

     // master computation stuff 

     end = clock(); 
     MPI_Reduce(&max_end, &end, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD); 

     cout << "CPU time was " 
      << (double)(max_end - min_start)/CLOCKS_PER_SEC 
      << " seconds" << endl; 
    } 
    else if (rank != 0) 
    { 
     // setup stuff 

     start = clock(); 
     MPI_Reduce(&min_start, &start, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD); 

     // slave computation stuff 

     end = clock(); 
     MPI_Reduce(&max_end, &end, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD); 
    } 
} 

我不知道錯誤的來源是什麼。當我在調試輸出(if (rank == 0)else if (rank != 0)語句後)

MPI_Barrier(MPI_COMM_WORLD); 
for (int i=0; i<size; i++) 
{ 
    if (rank == i) 
     cout << "(" << i << ") CPU time = " 
      << end << " - " << start 
      << " = " << end - start << endl; 
    MPI_Barrier(MPI_COMM_WORLD); 
} 

我得到以下輸出

CPU time was 1627.91 seconds 
(1) CPU time = 0 - 0 = 0 
(2) CPU time = 0 - 0 = 0 
(0) CPU time = 1627938704 - 32637 = 1627906067 
(3) CPU time = 10000 - 0 = 10000 
+0

首先,我根本不使用'clock()'。你可以在C++ 11中使用'chrono'或者在C++ 11中使用它的Boost實現。 –

回答

0

首先加入,man 3 clock說,「時鐘()函數返回處理器的近似值該程序使用的時間「。所以要確定你不需要計算差異的時間。這種誤解是錯誤的根源。您只需在密集計算後調用它並忽略setup stuff消耗的時間。

如果您不想將設置時間考慮在內,那麼您確實需要差異。因此,只需使用簡單而強大的MPI_Wtime函數,該函數從過去的某個固定時刻開始可以獲得精確的秒數。

通過從最大結束時間減去最小開始時間獲得的值不是通常接受的條件下的總體CPU時間(即根據time實用程序)。那個時間是real時間。爲了確保CPU時間,您應該總結所有處理時間,即撥打MPI_Reduce,並使用時間差和MPI_SUM操作。

+0

由於'MPI_Wtime'給出了掛牆時間而不是CPU時間,因此如果集羣上還運行其他作業,則報告的時間將會增加,對吧? 我的目標是能夠計算從串行執行到並行執行的加速。 – RagingRoosevelt

+2

@RagingRoosevelt從串行執行的加速應該計算爲一臺機器的掛機時間與N臺機器的掛機時間。 CPU時間不計入該計算 – NoseKnowsAll

+0

除了@NoseKnowsAll所說的內容之外,測量CPU時間也是毫無用處的。大多數MPI實現會產生額外的線程來處理網絡請求,如果其中任何一個實體都在輪詢數據,那麼'clock()'報告的總體CPU時間將會很快。此外,'clock()'是高度不可移植的,例如,它會在Windows上返回實時。 –