在點對點通訊和聚合通訊方式中,傳送程序和接收程序共同參與通訊過程。mpi提供另外一種通訊方式,即單邊通訊方式。在單邊通訊方式中,單個程序便可指定傳送和接收的資料。單邊通訊主要用於armci/ga(見第5章)、upc(見第4章)和openshmem(見第3章)等函式庫中,單邊通訊也可稱之為遠端記憶體訪問(rma)。
單邊通訊模型主要分為三部分。第一部分是建立mpi_win視窗物件,用於可被其他程序訪問的記憶體區域。第二部分是程序間資料移動方式,包含從遠端程序上讀、寫、更新等資料移動方式。第三部分是實現對單邊通訊完成情況進行等待或者檢查等操作。單邊通訊模型中每一部分均有唯一的mpi格式。
mpi提供四種建立記憶體訪問視窗方法,從而針對不同的應用需求。mpi_win_create、mpi_win_allocate和mpi_win_allocate_shared三種函式為聚合方式,用於指定可被其他程序讀取和寫入的記憶體區域。mpi_win_create_dynamic函式允許單獨程序對其記憶體空間進行申請和釋放。
單邊通訊函式型別比較簡單,分為讀、寫、更新三種。最簡單的單邊通訊函式是通過mpi_put函式向遠端程序寫入資料(mpi-2 rma中唯一定義的原始單邊通訊函式),通過mpi_get函式從遠端程序讀取資料,以及通過mpi_accumulate函式利用mpi預定義的歸約操作對遠端程序中的資料進行更新。mpi-3對這三種單邊通訊函式進行了完善,增加了非阻塞式單邊通訊方式,從而為使用者提供更加靈活的mpi實現方式。
由於mpi提供非阻塞式單邊通訊方式,因此需要提供額外的函式檢查或者等待非阻塞式通訊操作。mpi提供三種方式完成非阻塞式單邊通訊。最簡單的方式為呼叫mpi_win_fence函式,該函式屬於組呼叫方式,在一對mpi_win_fence呼叫函式間完成程序間資料通訊操作。當mpi_win_fence函式完成呼叫後,所有的單邊通訊操作均已完成,例如資料緩衝區中的資料已被更改,本地程序中記憶體資料已完成定義的資料操作,可被本地程序自由訪問或更改。讀者可以通過查詢mpi手冊來獲取更多關於單邊通訊方式的介紹。在一定程度上,mpi_win_fence脫離了遠端記憶體訪問(rma)操作要求,遵循mpi rma資料訪問規範。
圖1-8所示的程式**是採用單邊通訊方式實現圖1-7中mpi_reduce操作。注意圖1-8所示的程式並非對圖1-7中程式的完整替換,只是用來介紹單邊通訊方式。通過使用單邊通訊方式,可非同步更新程序中資料,甚至乙個程序可以多次更新資料,但是該實現方式有潛在的並行規模可擴充套件性問題。
mpi提供的第二種單邊通訊完成方式相對於mpi_win_fence方式更加通用,稱之為可擴充套件規模的同步方式,例如mpi_win_post、mpi_win_start、mpi_win_complete和mpi_win_wait函式。首先,通過這些函式指定mpi資料視窗、單邊通訊的源程序和目標程序。因為這些函式不需要在通訊域的所有程序上使用阻塞式同步方式,因此並行規模是可擴充套件的。無論是mpi_win_fence同步方式,還是mpi_win_post等可擴充套件規模的同步方式,均需要在源程序和目標程序上採用同步操作,因為這兩種方法均為主動目標同步方式。
mpi提供的第三種單邊通訊完成方式只需通過源程序進行函式呼叫即可,稱之為被動目標同步,如圖1-9程式示例所示。其中,0號程序在while迴圈中不執行任何mpi函式。通過呼叫mpi_win_lock和mpi_win_unlock函式確保完成源程序和目標程序上資料的mpi rma操作。mpi_win_lockall和mpi_win_unlockall函式允許乙個程序在記憶體視窗中對其他所有程序上的資料執行rma操作。同時,mpi_win_flush函式也可用於被動目標同步,實現對目標程序的rma操作。mpi也提供返回mpi_request物件的讀、寫、更新三種型別的操作函式。使用者可使用mpi_test或mpi_wait函式檢查本地操作完成情況,無需等待下乙個rma同步呼叫操作。
以下細節需要注意,0號程序在訪問mpi視窗中本地資料前也需要呼叫mpi_win_lock函式。通過呼叫mpi_win_lock函式,確保所有在目標程序上掛起的記憶體操作均被執行。這是共享和遠端記憶體訪問程式設計模型中需要格外注意的細節,且經常被程式設計者誤解的地方(詳見[45]使用共享記憶體模型程式設計的常見錯誤示例)。mpi定義的記憶體模型可確保使用者得到連續和正確的資料,即使在無法實現快取記憶體一致性的計算機系統上也可正常工作。在mpi-2定義出現的時期,世界上最快的計算機系統支援快取記憶體一致性,但未來的高效能計算系統可能不完全支援快取記憶體一致性。mpi既提供滿足單邊通訊的記憶體準確性最低要求的基本函式外,還提供要求更加嚴格的函式,從而保證mpi程式能夠在大多數計算機系統上執行。mpi-3在現有記憶體訪問模型的基礎上,增加了「統一記憶體模型」,現在稱之為「分布式記憶體模型」。使用者可通過mpi_win_get_attr函式得知計算機系統是否支援「統一記憶體模型」,若系統支援該模型,則通過使用該模型將極大簡化記憶體一致性方面操作。
mpi-3在mpi-2的基礎上,極大地豐富了單邊通訊的操作函式,解決mpi-2函式中存在的問題,使mpi rma的應用更加廣泛,並提高單邊通訊的可移植性和效能。例如,mpi-3提供支援在許多並行演算法中常用的原子讀、寫和修改操作,例如mpi_fetch_and_op函式實現讀取和增加功能,mpi_compare_and_swap實現比較和交換功能。同時,mpi-3能夠建立共享記憶體視窗,在rma操作基礎上增加了記憶體直接儲存訪問功能。如果使用者需要使用rma 程式設計,建議了解mpi-3中增加的新特性。
《平行計算的程式設計模型》一1 11 總結
mpi第乙個版本發布距今已逾20多年了,在並行開發應用領域取得了巨大的成功,在大規模並行軟體開發應用中佔主導地位。mpi成功的原因在於mpi為並行軟體開發提供了健壯和完善的解決方案,並允許使用者高效地實現大規模並行軟體開發目標。mpi成功的具體原因可參考文獻 129 mpi定義的開放程序和避免了其他...
《平行計算的程式設計模型》一3 7 5 收集
集合函式執行聚集收集,將元素塊從每個參與pe的對稱源物件拷貝,並連續複製到參與集合操作的每個pe上的 更大的 對稱目標陣列,程式設計師必須確保對稱目標陣列足夠大以便接收聚集的資料。對32和64位的資料型別都有收集函式,且對每種都有兩個收集函式變體 一般的collect允許每個pe貢獻不同數目的元素,...
《平行計算的程式設計模型》一2 3 3 屏障
接下來介紹的是核心api在執行屏障時的呼叫操作 與其他的屏障實現不同,gasnet中的同步實現是 分階段 且支援可選的id匹配。gasnet的分階段屏障特性在gasnet barrier wait的規範描述中非常明顯,其描述為 這是乙個只有在所有節點呼叫gasnet barrier notify 函...