c – 如何在Linux上使用Intel Westmere 1GB頁面?
編輯:我更新了我的問題與我的基準的細節
對於基準測試,我試圖在執行在兩個Intel Xeon 56xx(“Westmere”)處理器之上的Linux 3.13系統中設定1GB頁面.為此,我修改了我的引導引數以新增對1GB頁面的支援(10頁).這些引導引數僅包含1GB頁面,而不是2MB頁面.執行giantadm– 列表導致:
SizeMinimumCurrentMaximumDefault 1073741824101010*
我的核心引導引數被考慮在內.在我的基準測試中,我正在分配1GiB的記憶體,我想用1GiB巨大的頁面來支援:
#define PROTECTION (PROT_READ | PROT_WRITE) #define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB) uint64_t size = 1UL*1024*1024*1024; memory = mmap(0, size, PROTECTION, FLAGS, 0, 0); if (memory == MAP_FAILED) { perror("mmap"); exit(1); } sleep(200)
看板凳上的/ proc / meminfo(睡眠呼叫上面),我們可以看到一個巨大的頁面已經被分配:
AnonHugePages:4096 kB HugePages_Total:10 HugePages_Free:9 HugePages_Rsvd:0 HugePages_Surp:0 Hugepagesize:1048576 kB
注意:在運行臺式機之前,我禁用了THP(通過/ sys檔案系統),所以我猜到/ proc / meminfo報告的AnonHugePages欄位代表THP在停止之前分配的巨大頁面.
在這一點上,我們可以認為一切都很好,但是不幸的是,我的長椅讓我認為使用了許多2MiB頁面,而不是一個1GiB頁面.這是解釋:
這個臺座通過指標的追逐來隨機訪問分配的記憶體:第一步填充記憶體以啟用指標追逐(每個單元格指向另一個單元格),而在第二個步驟中,臺架通過記憶體導航
pointer = *pointer;
使用perf_event_open系統呼叫,我正在計數資料TLB讀取缺失僅用於長凳的第二步.當記憶體分配大小為64MiB時,我計算的數量很少,我的6400000記憶體訪問的0,01%,資料TLB讀取未命中.所有訪問都儲存在TLB中.換句話說,TLB中可以保留64MiB的記憶體.一旦分配的記憶體大小超過64 MiB,我看到資料tlb讀取未命中.對於記憶體大小等於128 MiB,我的TLB中缺少6400000記憶體訪問的50%. 64MiB似乎是可以適合TLB和64MiB = 32個條目(如下所報)* 2MiB頁面的大小.我的結論是我沒有使用1GiB的頁面,而是使用2MiB的頁面.
你能看到這個行為的任何解釋嗎?
此外,cpuid工具報告了我的系統上的tlb:
cache and TLB information (2): 0x5a: data TLB: 2M/4M pages, 4-way, 32 entries 0x03: data TLB: 4K pages, 4-way, 64 entries 0x55: instruction TLB: 2M/4M pages, fully, 7 entries 0xb0: instruction TLB: 4K, 4-way, 128 entries 0xca: L2 TLB: 4K, 4-way, 512 entries L1 TLB/cache information: 2M/4M pages & L1 TLB (0x80000005/eax): L1 TLB/cache information: 4K pages & L1 TLB (0x80000005/ebx): L2 TLB/cache information: 2M/4M pages & L2 TLB (0x80000006/eax): L2 TLB/cache information: 4K pages & L2 TLB (0x80000006/ebx):
如您所見,沒有關於1GiB頁面的資訊. TLB中可以快取多少頁?
TL; DR
您(具體來說,您的處理器)在這種情況下無法從1GB頁面中受益,但您的程式碼是正確的,無需對系統進行修改.
長版
我按照這些步驟嘗試重現你的問題.
My System: Intel Core i7-4700MQ, 32GB RAM 1600MHz, Chipset H87
> svn co https://github.com/ManuelSelva/c4fun.git
> cd c4fun.git / trunk
>做.發現需要幾個依賴.安裝它們構建失敗,但mem_load建立和連結,所以沒有進一步追求.
>重新啟動系統,在GRUB時間附加到引導引數如下:
hugepagesz=1G hugepages=10 default_hugepagesz=1G
它保留10個1GB的頁面.
> cd c4fun.git / trunk / mem_load
>使用memload進行幾個測試,以隨機訪問模式模式,並將其固定到核心3,這不是0(引導處理器).
> ./mem_load -a rand -c 3 -m 1073741824 -i 1048576
這導致大約零TLB未命中.
> ./mem_load -a rand -c 3 -m 10737418240 -i 1048576
這導致了大約60%的TLB未命中.在我的預感中
> ./mem_load -a rand -c 3-m 4294967296 -i 1048576
這導致大約零TLB未命中.在我的預感中
> ./mem_load -a rand -c 3 -m 5368709120 -i 1048576
這導致了大約20%的TLB未命中.
此時我下載了cpuid實用工具.它給了我這個為cpuid -1 | grep -i tlb:
cache and TLB information (2): 0x63: data TLB: 1G pages, 4-way, 4 entries 0x03: data TLB: 4K pages, 4-way, 64 entries 0x76: instruction TLB: 2M/4M pages, fully, 8 entries 0xb5: instruction TLB: 4K, 8-way, 64 entries 0xc1: L2 TLB: 4K/2M pages, 8-way, 1024 entries L1 TLB/cache information: 2M/4M pages & L1 TLB (0x80000005/eax): L1 TLB/cache information: 4K pages & L1 TLB (0x80000005/ebx): L2 TLB/cache information: 2M/4M pages & L2 TLB (0x80000006/eax): L2 TLB/cache information: 4K pages & L2 TLB (0x80000006/ebx):
如您所見,我的TLB有4個條目,1GB的頁面.這很好地解釋了我的結果:對於1GB和4GB的競技場,TLB的4個時隙完全足以滿足所有的訪問.對於5GB的競技場和隨機訪問模式,5頁中的4頁只能通過TLB進行對映,所以追蹤指標到剩下的一個將導致一個錯過.將指標追蹤到未對映頁面的概率為1/5,因此我們預計錯誤率為1/5 = 20%,我們得出結論.對於10GB,4/10頁被對映,6/10不是錯誤率將是6/10 = 60%,我們得到了.
所以你的程式碼至少在我的系統上沒有修改.你的程式碼似乎沒有問題.
然後我對CPU-World進行了一些研究,而不是所有的CPU都列出了TLB幾何資料,有些則是.我看到的唯一一個與你的cpuid列印輸出完全匹配(可能有更多)是ofollow,noindex" target="_blank">Xeon Westmere-EP X5650 ; CPU-World並沒有明確表示資料TLB0有1GB頁面的條目,但是說處理器的“1GB大頁面支援”.
然後,我做了更多的研究,最後確定了它. RealWorldTech的作者在Sandy Bridge的記憶體子系統的討論中作出了一個(誠然,我還沒有找到原始碼).它讀as follows :
After address generation, uops will access the DTLB to translate from a virtual to a physical address, in parallel with the start of the cache access. The DTLB was mostly kept the same, but the support for 1GB pages has improved.Previously, Westmere added support for 1GB pages, but fragmented 1GB pages into many 2MB pages since the TLB did not have any 1GB page entries. Sandy Bridge adds 4 dedicated entries for 1GB pages in the DTLB.
(加重)
結論
不管什麼模糊的概念“CPU支援1GB頁面”代表,英特爾認為這並不意味著“TLB支援1GB頁面條目”.恐怕您無法在Intel Westmere處理器上使用1GB的頁面來減少TLB未命中的數量.
或者,英特爾通過將巨大的頁面(在TLB中)與大頁面區分開來,掩蓋了我們.
http://stackoverflow.com/questions/27951778/how-to-use-intel-westmere-1gb-pages-on-linux