
256
|
第九章
使用 multiprocessing 共用 numpy 資料
操作大型
numpy
陣列時,你一定在想是否能夠在不同行程之間共用資料,進行讀寫存
取,而不需要副本。這是可能的,但需要費一點功夫。我們要感謝 StackOverflow 的使
用者
pv
,謝謝他為這個示範例所提供的靈感
2
。
不要使用這個方法重新建立 BLAS、MKL、Accelerate 與 ATLAS 的行為,
這些程式庫在它們的基本型別裡全都具有多執行緒的支援,而且,它們很
可能比你所建立的任何新程序都經過更完善的偵錯。它們可能需要一些組
態工作才能夠啟用多執行緒的支援,然而,在你投注時間撰寫你自己的工
具(以及花時間偵錯)之前,最好先看看這些程式庫是否能夠提供你免費
的效能提升。
在不同行程之間共用大型矩陣有幾個好處︰
• 只有一份副本表示不浪費 RAM。
• 不浪費時間複製龐大的 RAM 區塊。
• 獲得在不同行程之間共用部分結果的可能性。
回顧第 225 頁的〈使用 numpy〉,想想我們利用
numpy
進行的 pi 估計示範,當時有一個
問題:產生隨機數字是一個循序的程序。在此,我們可以想像分叉多個共用一個大陣列
的行程,每個行程皆使用設置不同種子的隨機數字產生器,將隨機數字填入一部分陣
列,因此,相較於使用單一行程,這會更快完成大型隨機區塊的產生。
為了驗證這件事,我們私底下將後面即將出現的示範例修改成建立大型隨機矩陣
〔譯註〕
(10,000×80,000 個元素),分別產生循序版本以及將矩陣劃分成 4 個部分的平行版本 ...