mpi學習日誌 5 mpi4py與多點通訊續

2021-07-15 04:54:32 字數 1899 閱讀 2004

在多點通訊裡我們已經學習了廣播bcast,散播scatter,收集gather,規約reduce.

今天我們再來簡略看一些可能更為少用的多點通訊.

簡單來說就是收集+廣播.

gather中只有根程序會得到收集到的資訊,而allgather則是所有程序都會得到收集到的資訊,就相當於收集後再廣播一次.

reduce與allreduce的關係,和gather與allreduce類似.

也就是說,allreduce就是reduce之後得到的值會再廣播一次,即allreduce=reduce+bcast.

alltoall實現的是轉置的功能.

每個程序呼叫alltoall,都會把乙個列表傳遞出去,然後也是得到乙個列表.並且這兩個列表的長度都必須等於總程序數.

具體操作的時候,alltoall會把第i個程序提供的列表的第j項,放到第j個程序返回的列表的第i項.

也就是相當於在乙個n*n的矩陣a裡,實現了swap(aij,aji).這就是矩陣的轉置嘛.

scan的操作和allreduce類似,但又更複雜

scan會把前i個收集的資料reduce成乙個資料,返回傳送給第i個程序.

下面的**第i個程序會得到0+1+2+3+....的前i項和.

barrier是一種全域性同步,就是說全部程序進行同步.

當乙個程序呼叫barrier的時候,它會被阻塞.

當所有程序都呼叫了barrier之後,barrier會同時解除所有程序的阻塞.

相當於原本在跑道上跑得參差不齊的運動員,跑到起跑線上停下來等.當所有運動員都在起跑線上,他們才一起重新跑起來.

這就是所謂的全部程序進行同步.

說是這麼說,但執行起來發現並不是這回事.所有程序沒有像期待那樣先全部輸出begin,再全部輸出end,barrier這個函式彷彿形同虛設.

其實這裡問題不是在barrier,而是在print.

我們os的io是有緩衝的,乙個資料要出現在螢幕上,簡單來說是經過記憶體->標準io檔案->控制台螢幕.

而程序間不共享io檔案(後面會學到如何在mpi的程序裡共享檔案),共享控制台螢幕.

因此螢幕上語句的順序依賴os什麼時候將io檔案裡的內容推到螢幕上.

我們強制讓記憶體->標準io檔案和標準io檔案->控制台螢幕這兩步一起進行,也就是加上flush語句.

果然,輸出結果和我們的期待吻合了.

mpi學習日誌 2 mpi4py與點對點通訊

前文說到,mpi是資訊傳遞介面,因此資訊傳遞是mpi的重點.而程序中的資訊傳遞就是程序通訊 今天我們將看看mpi建立的一組程序是怎麼相互通訊的.程序通訊有許多種,點對點通訊,廣播,散播等.今天我們先學習點對點通訊.什麼是點對點通訊?其實就是最簡單的程序a向程序b傳送資訊,而程序b向程序a接收資訊.這...

mpi學習日誌 13 mpi4py與非阻塞型函式

繼續填坑.前面第二篇也說過,很多函式有分阻塞型版本和非阻塞型版本,非阻塞型版本的名字比阻塞型的名字多乙個i字首.那麼,非阻塞型函式又是怎麼回事?我們知道,點對點通訊裡的recv函式是乙個阻塞函式,也就是接收方要等傳送方傳送了資訊,函式才能返回.那麼對應的,非阻塞型函式就是,不管傳送方是否傳送了資訊,...

mpi學習日誌 1 mpi與python

mpi是什麼?它用來幹什麼?mpi是資訊傳遞介面 message passing inte ce 簡單來說就是乙個用來實現程序通訊的庫.它很多時候用於並行演算法的設計.下面我們先使用windows環境下python語言來了解mpi的使用.mpi在python的環境還是很好配置的.首先你得安裝好pyt...