MPI之資料型別

2021-08-10 08:25:44 字數 1899 閱讀 7036

我們知道,比較基本的mpi點對點通訊具有無法同時傳送不同資料型別(當然前面提到了可以使用mpi_packed,但是這樣會造成效能的極大損耗),因此mpi提供說明更通用的,混合的非連續通訊緩衝區的機制.直到執行(implementation)時再決定資料應該在傳送之前打包到連續緩衝中,還是直接從資料儲存區收集。

這裡提供的通用機制允許不需拷貝,而是直接傳送各種形式和大小的目標.我們並沒有假設mpi庫是用本地語言描述的連續目標.因此,如果使用者想要傳送乙個結構或乙個陣列部分,則需要向mpi提供乙個通訊緩衝區的定義,該定義用問題模仿那個結構和陣列部分的定義.這些工具可以用於使庫設計者定義能夠傳送用本地語言定義的目標的通訊函式:通過對可獲得的符號表或虛擬向量(dope vector)的定**碼即可. 這種高階通訊功能不是mpi的部分。

乙個通用的資料型別是乙個模糊的目標,它說明兩件事情:

乙個基本資料型別序列;

乙個整數(位元組)偏移(displacements)序列

該偏移不要求是整數,互相不同,公升序等.因此,各項的順序可以和儲存的順序不一致,並且同樣的項可以出現多次.這樣的序列我們稱之為」型別映像」(type map).

基本型別序列(忽略偏移)是該數路型別的「型別鑑字」(type signature).

typemap=, 是這樣的型別對映, 其typei是基本型別, dispi是偏移

typesig= 是相關的型別簽字. 這個型別對映和乙個基位址buf共同說明乙個通訊緩衝區:該通訊緩衝區包含n個項, 第 i 項在位址buf+dispi處,型別為typei. 乙個從該通訊緩衝區整合的訊息將含有n個值,其型別由typesig定義

乙個通用資料型別的偏移量是相對一些初始緩衝區位址的,這些偏移的絕對位址可以被替換掉:我們可以把它看作是零位址的相對偏移量.這個初始零位址是由常量mpi_bottom指明的.這樣,乙個資料型別可以說明通訊緩衝區內元素的絕對位址,這時buf引數傳遞的是mpi_bottom的值(乙個位置在記憶體中的位址可以通過呼叫mpi_address獲得)

生成乙個可連續的資料型別最簡單的方法就是使用mpi_type_contiguous(),允許把乙個資料型別複製到連續的位置

newtype的大小是count*oldtype,內容是連線count個oldtype,其中連線處的大小為為extend.下面為extend的定義:

資料型別的擴充(extent)被定義為該資料型別獲得的入口項中從第乙個型別到最後乙個型別間的距離,迴圈滿足分配的要求. 即如果

typemap=,

則 lb(typemap)=min dispj,

j ub(typemap)=max(dispj+sizeof(typej)),

j extent(typemap)=ub(typemap)-lb(typemap)+e (3.1)

如果typei 要求分配ki倍數的位元組位址, 則e是使extent(typemap)進入(rount)下乙個maxiki所需要的最小非負增長

其實,還有一種更通用的方法:就是使用mpi_type_vector,允許複製乙個資料型別到含有相等大小塊的空間.每個塊通過連線相同數量的舊資料型別的拷貝來獲得.塊與塊之間的空間是舊資料型別的extent的倍數.

另外還有乙個mpi_type_vector的異構版本:mpi_type_hvector.

mpi_type_struct是最通用的型別生成器,它能夠在上面介紹的基礎上進一步允許每個塊包含不同資料型別的拷貝。

mpi_type_indexed允許複製乙個舊資料型別到乙個塊序列中(每個塊是舊資料型別的乙個連線),每個塊可以包含不同的拷貝數目和具有不同的偏移.所有的塊偏移都是舊資料型別extent的倍數

mpi_type_hindexed是mpi_type_indexed的相應異構版本。

關於commit和free:

通訊中的資料型別(自定義的)必須被commit。可以使用乙個計數來記錄其使用情況,當必要時可以選擇釋放它。

MPI筆記 派生資料型別相關例子

檔名 mpi structs.c 目的 該 用於測試向量型別 結構型別 打包解包的傳輸效率 測試傳輸的資料是100000個mpi double型別,且以24為間隔儲存的資料 mpi type vector mpi type create struct 新 mpi type struct 棄 mpi ...

JS資料型別之基礎資料型別

基本資料型別是按值訪問的,也就是說我們可以操作儲存在變數中的實際的值 基本資料型別的值是不可改變的,任何方法都無法改變乙個基本資料型別的值。let name qin ling ling name lisi console.log name 輸出 lisi上面的例子看來name的值好像變了,這裡的基礎...

基礎之資料型別

基本型別包括位元組型 char 整型 int 和浮點型 float double 定義基本型別變數時,可以使用符號屬性signed unsigned 對於char int 和長度屬性short long 對於int double 對變數的取值區間和精度進行說明。下面列舉了dev c 下基本型別所佔位...