c++ 如何記憶對映一個巨大的矩陣?
假設你有一個巨大的(40 GB)特徵值(浮點)矩陣,行是不同的特徵,列是樣本/影象.
表格是按列計算的.
然後,它是完全訪問行和多執行緒(每個執行緒載入整行)幾次.
處理這個矩陣的最好辦法是什麼?我特別考慮了5點:
>由於它是在x64 PC上執行的,我可以記憶一次地對映整個矩陣,但是這有道理嗎?
>多執行緒(多執行緒初始化計算)的效果如何?
>如何佈局矩陣:行或列主要?
>在預先計算完成後,是否有助於將矩陣標記為只讀?
>可以像ofollow,noindex" target="_blank">http://www.kernel.org/doc/man-pages/online/pages/man2/madvise.2.html 這樣的東西加速嗎?
記憶體對映整個檔案可能會使該過程更容易.
您想要排列資料以優化最常見的訪問模式.聽起來資料將被寫入一次(逐列)並讀取數次(逐行).這表明資料應該按照主排序儲存.
一旦預計算完成後,只讀一次矩陣就可能無法提高效能(有一些可能的低階優化,但是我不認為任何實現它們),但是它會防止錯誤寫入資料你不打算.不妨.
一旦你的應用程式寫作和工作,madvise可能最終會變得有用.
我的整體建議:首先按照最簡單的方式編寫程式,然後將計時器放在整個事情和各種主要操作上.確保主要操作時間總和到整個時間,所以你可以確定你沒有丟失任何東西.然後將您的效能改進工作定位到實際佔用最多時間的元件.
根據JimR在他的評論中提到的4MB頁面,您可能最終想要檢視hugetlbfs或使用具有透明巨大頁面支援的Linux核心版本(合併為2.6.38,可能會被修補到早期版本).這可能會為您節省很多TLB漏洞,並說服核心在足夠大的塊中執行磁碟IO以分攤任何尋找開銷.
http://stackoverflow.com/questions/4839204/how-to-memory-map-a-huge-matrix