2015-01-14 21 views
18

संपादित: मैं बेंचमार्क करने के लिए मेरी बेंचमार्कलिनक्स पर इंटेल वेस्टमेरे 1 जीबी पेज का उपयोग कैसे करें?

के विवरण के साथ मेरे सवाल का अद्यतन, मैं सेटअप 1GB पृष्ठों के लिए एक लिनक्स 3.13 दो इंटेल जिऑन 56xx ("Westmere") के शीर्ष पर प्रोसेसर चल प्रणाली में कोशिश कर रहा हूँ । इसके लिए मैंने 1 जीबी पृष्ठों (10 पेज) के लिए समर्थन जोड़ने के लिए अपने बूट पैरामीटर को संशोधित किया। इन बूट पैरामीटर में केवल 1 जीबी पेज होते हैं और 2 एमबी नहीं होते हैं।

 Size Minimum Current Maximum Default 
1073741824  10  10  10  * 

मेरे कर्नेल बूट पैरामीटर को ध्यान में रखा जाता है: चल रहा है hugeadm --pool-list की ओर जाता है। मेरी बेंचमार्क में मैं स्मृति है कि मैं का उपयोग कर एक 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 को देखते हुए, जबकि बेंच (sleep कॉल ऊपर) सो रहा है, हम देख सकते हैं कि एक बहुत बड़ा पेज आबंटित की गई है:

AnonHugePages:  4096 kB 
HugePages_Total:  10 
HugePages_Free:  9 
HugePages_Rsvd:  0 
HugePages_Surp:  0 
Hugepagesize: 1048576 kB 

नोट: मैं विकलांग THP (/sys फाइल सिस्टम के माध्यम से) बेंच चलाने से पहले, तो मुझे लगता है कि AnonHugePages क्षेत्र /proc/meminfo द्वारा रिपोर्ट befo THP द्वारा आवंटित विशाल पृष्ठों का प्रतिनिधित्व करता है इसे रोकना

इस बिंदु पर हम सोच सकते हैं कि सब ठीक है, लेकिन दुर्भाग्य से मेरी पीठ मुझे यह सोचने के लिए प्रेरित करती है कि कई 2 एमआईबी पेजों का उपयोग किया जाता है और एक 1 जीआईबी पृष्ठ नहीं। यहां स्पष्टीकरण दिया गया है:

यह बेंच पॉइंटर के पीछा के माध्यम से आवंटित स्मृति को यादृच्छिक रूप से एक्सेस करता है: पहला कदम स्मृति का पीछा करने के लिए स्मृति को भरता है (प्रत्येक सेल दूसरे सेल पर इंगित करता है) और दूसरे चरण में बेंच मेमोरी के माध्यम से स्मृति के माध्यम से नेविगेट करता है

pointer = *pointer; 

perf_event_open सिस्टम कॉल का उपयोग करना, मैं भरोसा कर रहा हूँ डेटा TLB केवल बेंच के दूसरे चरण के लिए छूट जाए पढ़ें। जब स्मृति आवंटित आकार 64 एमआईबी है, तो मुझे डेटा की टीएलबी पढ़ने की याद आती है, मेरी 6400000 मेमोरी एक्सेसों में से 0,01% की बहुत छोटी संख्या है। सभी एक्सेस टीएलबी में सहेजी जाती हैं। दूसरे शब्दों में, टीएलबी में 64 एमआईबी मेमोरी रखी जा सकती है। जैसे ही आवंटित स्मृति आकार 64 एमआईबी से अधिक है, मुझे डेटा टीएलबी पढ़ने की याद आती है। स्मृति आकार के लिए 128 एमआईबी के बराबर है, मेरे पास 6400000 मेमोरी एक्सेस का 50% है जो टीएलबी में चूक गया है। 64 एमआईबी आकार का प्रतीत होता है जो टीएलबी और 64 एमआईबी = 32 प्रविष्टियों में फिट हो सकता है (जैसा कि नीचे रिपोर्ट किया गया है) * 2 एमआईबी पेज। मैंने निष्कर्ष निकाला है कि मैं 1 जीआईबी पेजों का उपयोग नहीं कर रहा हूं लेकिन 2 एमआईबीबी हूं।

क्या आप उस व्यवहार के लिए कोई स्पष्टीकरण देख सकते हैं?

इसके अलावा, 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 पृष्ठों के बारे में कोई जानकारी नहीं है। टीएलबी में कितने पेज कैश किए जा सकते हैं?

+1

क्या आप 'mmap (..., MAP_ANON | MAP_HUGETLB) 'का उपयोग कर सकते हैं? – abligh

+0

@abligh यह "स्मृति आवंटित नहीं कर सकता" के साथ विफल रहता है –

+0

क्या आपके पास अपने कर्नेल में संकलित विशाल पृष्ठ समर्थन है? – abligh

उत्तर

18

टी एल; डॉ

आप (विशेष रूप से, आपके प्रोसेसर) इस परिदृश्य में 1GB पृष्ठों से लाभ नहीं कर सकते हैं, लेकिन अपने कोड प्रणाली है कि कर सकते हैं पर संशोधनों के बिना सही है।

लांग संस्करण

मैं आपकी समस्या को पुन: पेश करने का प्रयास करने के लिए निम्न चरणों का पालन किया।

My System: Intel Core i7-4700MQ, 32GB RAM 1600MHz, Chipset H87 
  1. svn co https://github.com/ManuelSelva/c4fun.git
  2. cd c4fun.git/trunk
  3. make। कुछ निर्भरताओं की खोज की जरूरत थी। उन्हें स्थापित किया। बिल्ड विफल रहा, लेकिन mem_load ने निर्माण और लिंक किया, इसलिए बाकी को आगे नहीं बढ़ाया।
  4. प्रणाली रिबूट, बूट तर्क निम्नलिखित GRUB को समय जोड़कर:

    hugepagesz=1G hugepages=10 default_hugepagesz=1G 
    

    जो 10 1GB पृष्ठों सुरक्षित रखता है।

  5. cd c4fun.git/trunk/mem_load
  6. यादृच्छिक अभिगम पैटर्न मोड में, memload का उपयोग कर और कोर 3 पर पिन कई परीक्षण Ran, जो कुछ है कि 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 1GB पृष्ठों के लिए 4 प्रविष्टियां हैं। यह मेरे परिणामों को अच्छी तरह से बताता है: 1 जीबी और 4 जीबी एरिना के लिए, टीएलबी के 4 स्लॉट सभी एक्सेसों को पूरा करने के लिए पूरी तरह से पर्याप्त हैं। 5 जीबी एरिना और यादृच्छिक-पहुंच पैटर्न मोड के लिए, 5 पृष्ठों में से 4 को केवल टीएलबी के माध्यम से मैप किया जा सकता है, इसलिए शेष में एक पॉइंटर का पीछा करना मिस का कारण बन जाएगा। अप्रयुक्त पृष्ठ में पॉइंटर का पीछा करने की संभावना 1/5 है, इसलिए हम 1/5 = 20% की मिस दर की अपेक्षा करते हैं और हमें वह मिलता है। 10 जीबी के लिए, 4/10 पेज मैप किए गए हैं और 6/10 नहीं हैं इसलिए मिस रेट 6/10 = 60% होगी, और हमें वह मिला।

तो आपका कोड कम से कम मेरे सिस्टम पर संशोधनों के बिना काम करता है। आपका कोड तब समस्याग्रस्त प्रतीत नहीं होता है।

मैंने फिर सीपीयू-वर्ल्ड पर कुछ शोध किया, और सभी सीपीयू टीएलबी ज्यामिति डेटा के साथ सूचीबद्ध नहीं हैं, कुछ हैं।केवल एक मैंने देखा है कि आपके सीपीयूइड प्रिंटआउट से मेल खाता है (वहां और भी हो सकता है) Xeon Westmere-EP X5650 है; सीपीयू-वर्ल्ड स्पष्ट रूप से नहीं कहता है कि डेटा टीएलबी 0 में 1 जीबी पेजों के लिए प्रविष्टियां हैं, लेकिन कहती हैं कि प्रोसेसर में "1 जीबी बड़ा पेज सपोर्ट" है।

मैंने फिर और अधिक शोध किया और अंत में इसे खींचा। रीयलवर्ल्डटेक के एक लेखक ने सैंडी ब्रिज के मेमोरी सबसिस्टम की चर्चा में एक (स्वीकार्य रूप से, मुझे इसके लिए अभी भी एक स्रोत मिलना चाहिए) बंद कर दिया है। यह as follows पढ़ता है:

पते पीढ़ी के बाद, UOPs DTLB अनुवाद करने के लिए एक आभासी से एक भौतिक पता करने के लिए, समानांतर में कैश पहुँच की शुरुआत के साथ उपयोग करेंगे। डीटीएलबी को ज्यादातर वही रखा गया था, लेकिन 1 जीबी पृष्ठों के लिए समर्थन में सुधार हुआ है। पहले, वेस्टमेरे ने 1 जीबी पृष्ठों के लिए समर्थन जोड़ा, लेकिन 1 जीबी पृष्ठों को कई 2 एमबी पृष्ठों में विभाजित किया क्योंकि टीएलबी में कोई 1 जीबी पेज प्रविष्टियां नहीं थीं। सैंडी ब्रिज डीटीएलबी में 1 जीबी पृष्ठों के लिए 4 समर्पित प्रविष्टियां जोड़ता है।

(जोर जोड़ा)

निष्कर्ष

जो कुछ भी अस्पष्ट अवधारणा "सीपीयू 1GB पृष्ठों का समर्थन करता" का प्रतिनिधित्व करता है, इंटेल सोचता है कि यह संकेत नहीं करता है "TLB 1GB पेज प्रविष्टियों का समर्थन करता है"। मुझे डर है कि आप टीएलबी मिस की संख्या को कम करने के लिए इंटेल वेस्टमेरे प्रोसेसर पर 1 जीबी पेजों का उपयोग नहीं कर पाएंगे।

यही कारण है, या इंटेल बड़े पृष्ठों से विशाल पृष्ठों (TLB में) भेद से हमें धोखा दे रहा है।

+2

आपके शोध और उत्तर के लिए धन्यवाद, और धन्यवाद stackoverflow ;-) –

संबंधित मुद्दे