我在 HPC 上反轉非常大的矩陣。顯然,這對 RAM 有很高的要求。為了避免記憶體不足錯誤,作為臨時解決方案,我剛剛請求了大量記憶體 (TB)。如何使用 numpy.linalg.inv 從輸入矩陣大小預測矩陣求逆所需的記憶體,以更有效地運行 HPC 作業?
uj5u.com熱心網友回復:
TL;DR:型別為 的輸入矩陣最多為O(32 n2)位元組。(n,n)float64
numpy.linalg.inv_umath_linalg.inv 內部呼叫而不執行任何復制或創建任何額外的大型臨時陣列。這個內部函式本身在內部呼叫 LAPACK函式。據我了解,Numpy 的包裝層負責分配輸出的 Numpy 矩陣。C 代碼本身分配一個臨時陣列(參見:此處)。Numpy 似乎沒有為此操作執行其他陣列分配。有多個 Lapack 實作,因此通常無法知道 Lapack 呼叫請求了多少記憶體。然而,AFAIK,幾乎所有的 Lapack 實作都不會在你的背后分配資料:呼叫者必須這樣做(尤其是這里使用的sgesv/ )。dgesv假設(n, n)輸入矩陣是型別float64和 FORTRAN 整數是 4 位元組明智的(在大多數平臺上應該是這種情況,尤其是在 Windows 上),那么實際所需的記憶體(由輸入矩陣、輸出矩陣和臨時矩陣占用)是8 n2 8 n2 (8 n2 8 n2 4 n)位元組,等于(32 n 4) n或簡單O(32 n2)的位元組。請注意,臨時緩沖區是最大大小,可能未完全寫入,這意味著作業系統只能物理映射(即保留在物理 RAM 中)分配的空間的一小部分。這就是在我的(Linux)機器上使用 OpenBLAS 發生的情況:只有24 n2位元組看起來實際上是物理映射的。對于float32矩陣,它是空間的一半。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/414371.html
標籤:
