2014-04-30 40 views
1

我有一段需要時間的MPI代碼(由其他人編寫)。代碼的基本佈局如下。概括地說,代碼的作用平行SVD兩個部分解決矩陣A的:(1)第一分割矩陣A均勻n處理器之間,然後(2)執行SVD解決:如何正確計時MPI代碼

int main(){ 

    1. Code to split A among the different processors... 

    2. actual parallel SVD solve 

} 

我只想要部分(2)代碼(在處理器之間分配A之後的SVD求解)。我嘗試以下,但我不知道,如果輸出是正確的:

int main(){ 

    1. Code to split A among the different processors... 

    MPI_Barrier(MPI_COMM_WORLD); 
    double start = MPI_Wtime(); 

    2. actual parallel SVD solve 

    MPI_Barrier(MPI_COMM_WORLD); 
    double end = MPI_Wtime(); 

    if (MyPID == 0){ cout << end - start << endl;} 
} 

我非常新的MPI和不知道如果我正確使用MPI_Barrier命令,或者如果我真的甚至需要它。輸出時間是否會正確忽略部分(1)所需的時間?

回答

2

如果我正確理解你,你想做一個分佈式SVD。你看過線性代數庫ScaLAPACK嗎?它的commands for singular value decomposition應該完全按照你的需要來做。

至於你使用MPI_Barrier:沒有太多的東西:已通過的通信器上的所有進程都要等到該通信器上的其他每個進程都到達這一行代碼。但MPI_Barrier不保證在屏障同步後執行。首先,即使由於中斷而在相同的CPU類型上執行,每個進程的性能也會略有不同,其次,在MPI_Barrier之後重新開始執行時,每個進程的性能會有微小的差異。總體而言,您應儘可能避免MPI_Barrier。我把它看作是一個比在生產代碼中想要看到的東西更多的調試工具。另外:當您計劃使用集體通信時,您不需要MPI_Barrier

最後一個句子來整體設計的,它往往是一個錯誤的MPI初學者做,他們認爲這是非常有用的一個主進程管理所有的信息和分配問題,工作節點。但是,這種設計確實意味着很多通信和同步。溝通(尤其是計算機之間)的溝通相對較慢,不惜一切代價避免。更有利的方法通常是設計平坦的設計,其中每個過程都在自己的問題上咀嚼。

編輯:剛纔看到了一行關於MPI_Wtime的一句話:那段代碼似乎是正確的。再舉一個例子,你可以看看this tutorial。如果這個計劃的唯一目的是衡量時間,我想第一個MPI_Barrier有些可行,但第二個肯定不是。爲什麼你必須在停止時間之前同步你的過程? MPI_Wtime對執行它的進程是本地的。

一兩件事:如果你有機會到VampirTrace(請向羣集管理員),你可以做一個更深入的分析,並得到相當圖:

example of the VampirTrace gui

PS:任何人都可以提出的自由變體VampirTrace?

+0

niklasfi,有俄羅斯項目'openvampir':https://bitbucket.org/hpcc_kpi/openvampir/wiki/Home,但我沒有檢查它。另外我認爲大多數MPI具有內建跟蹤,例如MPICH有'jumpshot's:http://www.mcs.anl.gov/research/projects/perfvis/software/viewers/並且OpenMPI的FAQ說:http://www.open-mpi.org/faq/?category = perftools#view-VT TUD有從Vampir的OTF到LaTeX的免費轉換器http://tu-dresden.de/die_tu_dresden/zentrale_einrichtungen/zih/forschung/projekte/otf – osgx