即使是使用mpi介面實現並行程式設計,我們必須明確mpi最大的效能消耗在**,幾乎所有的分布式記憶體系統,通訊比本地計算的成本都會高出許多。因此,如果減少傳送的訊息數量,就能肯定相對的提高程式的效能。mpi提供了三個基本的手段來整合可能需要多條訊息的資料,不同通訊函式中的count引數派生資料型別,以及mpi_pack、upack函式。
在mpi中,通過同時儲存資料項的型別以及他們在記憶體的相對位置,派生資料型別可以用來表示記憶體中資料項的任意組合。其主要的思想是:如果傳送資料的函式知道資料項的型別以及在記憶體中資料項集合的相對位置,就可以在資料項被傳送出去之前在記憶體中將資料項聚集起來。
正式地,乙個派生資料型別是由一系列的mpi基本資料型別和每個資料型別的偏移組成的。
類似:每一對資料項的第乙個元素表明資料型別,第二個元素是該資料項相對於起始位置的偏移。
我們可以使用mpi_type_create_struct 函式建立由不同的基本資料型別的元素所組成的派生資料型別。
正在上傳…
取消@count 指的是資料型別中元素的個數。
@ array_of_blocklengths 允許單獨的資料項可能是陣列或者子陣列。
@array_of_displacements 指定了距離訊息起始位置的偏移量。
@array_of_types 依次指定了資料的型別
@new_type 新資料型別
為了能獲取這些數值,我們有專門的函式mpi_get_address函式。
正在上傳…
取消他返回的是location 所指的記憶體單元的位址。
效能統計:
time is an important factor which over a progaming runing. 程式的執行的時間是乙個非常重要的指標在程式執行的過程中。mpi也有自己的計算時間相關的函式。
mpi_wtime(); /*獲取上某乙個時刻導到現在的時間* /
start = mpi_wtime();
end = mpi_wtime();
time_length = end - start;
這裡我們其實需要關心乙個問題,程式最理想的情況下,所有程序都需要等到最後乙個程序完成計算時才得到最終的結果,換句話說,並行時間取決於「最慢」程序花費的時間。
加速比:
加速比經常用來衡量序列運算與並行運算時間之間的關係,表示序列時間和並行時間的比值:
s(n,p) = t(序列)/ t (並行)
效率:效率也是評價並行效能的重要指標之一,其實是每乙個程序的加速比。
e(n,p) = s(n,p)/p
MPI之資料型別
我們知道,比較基本的mpi點對點通訊具有無法同時傳送不同資料型別 當然前面提到了可以使用mpi packed,但是這樣會造成效能的極大損耗 因此mpi提供說明更通用的,混合的非連續通訊緩衝區的機制.直到執行 implementation 時再決定資料應該在傳送之前打包到連續緩衝中,還是直接從資料儲存...
MPI筆記 派生資料型別相關例子
檔名 mpi structs.c 目的 該 用於測試向量型別 結構型別 打包解包的傳輸效率 測試傳輸的資料是100000個mpi double型別,且以24為間隔儲存的資料 mpi type vector mpi type create struct 新 mpi type struct 棄 mpi ...
聯合體(union)以及資料的儲存
當多個資料需要共享記憶體或多個資料每次只取其一時,可以利用聯合體 union 有關聯合體的描述如下 1.聯合體是乙個結構 2.它的所有成員相對於基位址的偏移量都為0 3.此結構空間要大到足夠容納最 寬 的成員 4.其對齊方式要適合其中所有的成員。對上面四句話的理解 由於聯合體的所有成員是共享一段記憶...