performance - गैर-अस्थायी भार और हार्डवेयर प्रीफ़ेचर, क्या वे एक साथ काम करते हैं?




x86 sse (3)

मैंने हाल ही में एक और सवाल का जवाब देते हुए विभिन्न prefetch फ्लेवर्स के कुछ परीक्षण किए और मेरे निष्कर्ष थे:

prefetchnta का उपयोग करने के परिणाम स्काइलेक क्लाइंट पर निम्नलिखित कार्यान्वयन के अनुरूप थे:

  • prefetchnta L1 और L3 में मानों को लोड करता है लेकिन L2 नहीं (वास्तव में, ऐसा लगता है कि लाइन L2 से बेदखल हो सकती है यदि यह पहले से ही वहां है)।
  • यह मान को "सामान्य रूप से" L1 में लोड करता है, लेकिन L3 में एक कमजोर तरीके से इसे अधिक तेज़ी से बाहर निकाला जाता है (जैसे, केवल सेट में एक ही तरीके से, या इसके LRU ध्वज सेट के साथ ऐसा है कि यह होगा अगला शिकार)।
  • prefetchnta , अन्य सभी प्रीफ़ैच निर्देशों की तरह, LFB प्रविष्टि का उपयोग करें, इसलिए वे वास्तव में आपको अतिरिक्त समानता लाने में मदद नहीं करते हैं: लेकिन N2 संकेत L2 और L3 प्रदूषण से बचने के लिए यहां उपयोगी हो सकता है।

वर्तमान अनुकूलन मैनुअल (248966-038) कुछ स्थानों पर दावा करता है कि prefetchnta एल 2 में डेटा लाता है, लेकिन सेट से केवल एक ही तरीके से। जैसे, 7.6.2.1 में वीडियो एनकोडर :

वीडियो एनकोडर के लिए कार्यान्वित प्रीफ़ैचिंग कैश प्रबंधन मेमोरी ट्रैफ़िक को कम करता है। एकल-स्तरीय वीडियो फ्रेम डेटा को दूसरे स्तर के कैश में प्रवेश करने से रोककर दूसरे स्तर के कैश प्रदूषण में कमी सुनिश्चित की जाती है। गैर-अस्थायी PREFETCH (PREFETCHNTA) निर्देश का उपयोग करना दूसरे स्तर के कैश के केवल एक तरीके में डेटा लाता है, इस प्रकार दूसरे स्तर के कैश के प्रदूषण को कम करता है।

यह स्काईलेक पर मेरे परीक्षण के परिणामों के अनुरूप नहीं है, जहां प्रीफेटेन्क्टा के साथ 64 केबी क्षेत्र पर prefetchnta प्रदर्शन को लगभग बिल्कुल L3 से डेटा प्राप्त करने के अनुरूप दिखाता है (~ 4 चक्र प्रति लोड, 10 के एमएलपी कारक और एक L3 विलंबता के साथ लगभग 40 चक्र):

                                 Cycles       ns
         64-KiB parallel loads     1.00     0.39
    64-KiB parallel prefetcht0     2.00     0.77
    64-KiB parallel prefetcht1     1.21     0.47
    64-KiB parallel prefetcht2     1.30     0.50
   64-KiB parallel prefetchnta     3.96     1.53

चूंकि Skylake में L2 4-वे है, यदि डेटा को एक तरह से लोड किया गया था, तो इसे L2 कैश में बस मुश्किल से रहना चाहिए (एक तरीका जिसमें 64 KiB शामिल है), लेकिन ऊपर दिए गए परिणाम संकेत करते हैं कि यह नहीं है।

आप लिनक्स पर मेरे uarch-bench कार्यक्रम का उपयोग कर अपने हार्डवेयर पर इन परीक्षणों को चला सकते हैं। पुरानी प्रणालियों के लिए परिणाम विशेष रूप से दिलचस्प होंगे।

स्काईलेक सर्वर (SKLX)

स्काईलेक सर्वर पर प्रीफेटेक्नेटा का सूचित व्यवहार, जिसमें एक different एल 3 कैश आर्किटेक्चर है, स्काइलेक क्लाइंट से काफी अलग है। विशेष रूप से, उपयोगकर्ता मिस्टीरियल रिपोर्ट जो प्रीफ़ेक्ट्न्टा का उपयोग करके लाई गई लाइनें किसी भी कैश स्तर में उपलब्ध नहीं हैं और L1 से निकाले जाने के बाद DRAM से फिर से पढ़ना चाहिए।

सबसे अधिक संभावना स्पष्टीकरण यह है कि वे प्रीफेटेक्नेटा के परिणामस्वरूप कभी भी एल 3 में प्रवेश नहीं करते हैं - यह संभव है क्योंकि स्काईलेक सर्वर में एल 3 निजी एल 2 कैश के लिए एक गैर-समावेशी साझा पीड़ित कैश है, इसलिए एल 2 कैश का उपयोग करने वाली लाइनें prefetchnta को संभवतः L3 में प्रवेश करने का मौका नहीं मिलता है। यह prefetchnta को फ़ंक्शन में अधिक शुद्ध बनाता है: कम कैश का स्तर prefetchnta अनुरोधों से प्रदूषित होता है, लेकिन यह भी अधिक भंगुर होता है: एल 1 से nta लाइन पढ़ने में कोई विफलता इससे पहले कि बेदखल किया जाता है, इसका मतलब है कि स्मृति के लिए एक और पूर्ण राउंडट्रिप: prefetchnta द्वारा ट्रिगर किया गया प्रारंभिक अनुरोध पूरी तरह से बर्बाद हो गया है।

लगातार स्मृति स्थानों से _mm_stream_load_si128() कॉल ( MOVNTDQA ) की एक श्रृंखला को निष्पादित करते समय, हार्डवेयर प्री-भ्रूण अभी भी किक-इन करेगा, या क्या मुझे अभी भी प्रीफ़ेचिंग के लाभों को प्राप्त करने के लिए स्पष्ट सॉफ़्टवेयर MOVNTDQA ( MOVNTDQA संकेत के साथ) का उपयोग करना चाहिए। कैश प्रदूषण से बच रहे हैं?

मैं इसका कारण पूछता हूं क्योंकि उनके उद्देश्य मुझे विरोधाभासी लगते हैं। एक स्ट्रीमिंग लोड कैश को दरकिनार करते हुए डेटा लाएगा, जबकि प्री-भ्रूण कैश में डेटा लाने का प्रयास करता है।

जब क्रमिक रूप से एक बड़ी डेटा संरचना को पुनरावृत्त किया जाता है (संसाधित डेटा को लंबे समय में पुनर्प्राप्त नहीं किया जाएगा), तो मुझे यह समझ में आएगा कि चेज़ पदानुक्रम को प्रदूषित करने से बचने के लिए, लेकिन मैं बार-बार ~ 100% एकरूपता में बीमा नहीं करना चाहता क्योंकि -फाइटर आइडल है।

लक्ष्य वास्तुकला इंटेल सैंडीब्रिज है


यह सवाल मुझे कुछ पढ़ने के लिए मिला ... MOVNTDQA के लिए इंटेल मैनुअल (एक Sep'14 संस्करण का उपयोग करके) को देखते हुए, एक दिलचस्प बयान है -

एक प्रोसेसर कार्यान्वयन इस निर्देश से जुड़े गैर-अस्थायी संकेत का उपयोग कर सकता है यदि स्मृति स्रोत WC है (संयोजन लिखें) स्मृति प्रकार। एक कार्यान्वयन इस निर्देश से जुड़े गैर-अस्थायी संकेत का उपयोग भी कर सकता है यदि स्मृति स्रोत WB है (वापस लिखें) मेमोरी प्रकार।

और बाद में -

पढ़ा जा रहा क्षेत्र का मेमोरी प्रकार गैर-अस्थायी संकेत को ओवरराइड कर सकता है, यदि गैर-अस्थायी रीड के लिए निर्दिष्ट मेमोरी पता WC मेमोरी क्षेत्र नहीं है।

ऐसा प्रतीत होता है कि गैर-अस्थायी संकेत कुछ भी नहीं करेगा जब तक कि आपका मेम प्रकार डब्ल्यूसी नहीं है। मैं वास्तव में नहीं जानता कि डब्ल्यूबी मेमटाइप टिप्पणी का क्या मतलब है, शायद कुछ इंटेल प्रोसेसर आपको कैश प्रदूषण को कम करने के लाभों के लिए इसका उपयोग करने की अनुमति देते हैं, या शायद वे भविष्य के लिए इस विकल्प को रखना चाहते थे (इसलिए आप उपयोग शुरू नहीं करते हैं WB मेम पर MOVNTDQA और मान लें कि यह हमेशा एक ही व्यवहार करेगा), लेकिन यह काफी स्पष्ट है कि WC मेम यहां वास्तविक उपयोग का मामला है। आप चाहते हैं कि यह निर्देश सामान के लिए कुछ अल्पकालिक बफ़रिंग प्रदान करे जो अन्यथा पूरी तरह से उपलब्ध नहीं होगा।

अब, दूसरी ओर, पहले से वर्णन के लिए देख रहे हैं *:

अनचाहे या डब्ल्यूसी मेमोरी से प्रीफ़ेट को अनदेखा किया जाता है।

ताकि कहानी बहुत ज्यादा बंद हो जाए - आपकी सोच बिल्कुल सही है, इन दोनों का मतलब नहीं है और साथ काम करने की संभावना नहीं है, संभावना है कि उनमें से एक को नजरअंदाज कर दिया जाएगा।

ठीक है, लेकिन क्या यह मौका है कि ये 2 वास्तव में काम करेंगे (यदि प्रोसेसर डब्ल्यूबी मेमोरी के लिए एनटी लोड लागू करता है)? खैर, फिर से MOVNTDQA से पढ़ते हुए, कुछ और नज़र को पकड़ता है:

कैश में मौजूद कोई भी मेमोरी-टाइप अलियासड लाइन स्नूप और फ्लश हो जाएगी।

आउच। इसलिए यदि आप किसी तरह से अपने कैश में प्रीफ़ैच करने का प्रबंधन करते हैं, तो आप वास्तव में किसी भी लगातार स्ट्रीमिंग लोड के प्रदर्शन को कम करने की संभावना रखते हैं, क्योंकि इसके लिए पहले लाइन को फ्लश करना होगा। सुंदर विचार नहीं है।


MOVNTDQA (WC मेमोरी पर) और PREFETCHNTA दोनों किसी भी कैश हार्डवेयर PREFETCHNTA को प्रभावित या ट्रिगर नहीं करते हैं। गैर-अस्थायी संकेत का पूरा विचार कैश प्रदूषण से पूरी तरह से बचने या कम से कम इसे यथासंभव कम से कम करने के लिए है।

MOVNTDQA का उपयोग करके प्राप्त कैश लाइनों को होल्ड करने के लिए स्ट्रीमिंग लोड बफ़र (ये लाइन भरण बफ़र्स और L1 कैश से अलग हैं) नामक बफ़र्स की केवल एक बहुत छोटी संख्या ( MOVNTDQA । तो मूल रूप से आपको वह उपयोग करने की आवश्यकता है जो आप लगभग तुरंत प्राप्त करते हैं। इसके अलावा, MOVNTDQA केवल WC मेमोरी पर काम करता है।

PREFETCHNTA निर्देश आपके परिदृश्य के लिए एकदम सही है, लेकिन आपको यह पता लगाना होगा कि इसे अपने कोड में ठीक से कैसे उपयोग किया जाए। इंटेल ऑप्टिमाइज़ेशन मैनुअल सेक्शन 7.1:

यदि आपका एल्गोरिथ्म PREFETCHNTA एकल-पास उपयोग है। यदि आपका एल्गोरिथ्म बहु-पास उपयोग PREFETCHT0 है।

PREFETCHNTA निर्देश निम्नलिखित लाभ प्रदान करता है:

  • यह उस विशेष कैश लाइन को प्राप्त करता है जिसमें निर्दिष्ट पता कम से कम L3 कैश और / या संभवतः उच्च स्तर के कैश पदानुक्रम में होता है (मधुमक्खी और पीटर का उत्तर और अनुभाग 7.3.2 देखें)। प्रत्येक कैश स्तर में यह कैश हो जाता है, इसे पहले से सेट होने की स्थिति में बेदखल करने की आवश्यकता / अधिक होनी चाहिए। एक एकल-पास एल्गोरिथ्म के कार्यान्वयन में (जैसे कि बड़ी संख्या के औसत की गणना करना) जो कि PREFETCHNTA साथ बढ़ाया जाता है, बाद में PREFETCHNTA कैश लाइनों को उसी ब्लॉक में रखा जा सकता है, जो PREFETCHNTA का उपयोग करते हुए PREFETCHNTA किए गए थे। इसलिए, भले ही कुल डेटा की मात्रा बड़े पैमाने पर हो, पूरे कैश का केवल एक ही तरीका प्रभावित होगा। अन्य तरीकों से रहने वाला डेटा कैश रहेगा और एल्गोरिथम समाप्त होने के बाद उपलब्ध होगा। लेकिन यह दोधारी तलवार है। यदि दो PREFETCHNTA निर्देश एक-दूसरे के बहुत करीब हैं और यदि निर्दिष्ट पते उसी कैश सेट पर मैप करते हैं, तो केवल एक ही जीवित रहेगा।
  • PREFETCHNTA उपयोग से PREFETCHNTA में कैश की गई पंक्तियों को किसी अन्य कैश्ड लाइनों की तरह ही समरूप रखा जाता है जो समान हार्डवेयर समरूपता तंत्र का उपयोग करते हैं।
  • यह WB, WC और WT मेमोरी प्रकारों पर काम करता है। संभवत: आपका डेटा WB मेमोरी में संग्रहीत है।
  • जैसा कि मैंने पहले कहा था, यह हार्डवेयर प्रीफ़ेटिंग को ट्रिगर नहीं करता है। यह इस कारण से है कि इसका उपयोग इंटेल द्वारा अनुशंसित अनियमित मेमोरी एक्सेस पैटर्न के प्रदर्शन को बेहतर बनाने के लिए भी किया जा सकता है।

जो धागा PREFETCHNTA को क्रियान्वित करता है, वह उसी भौतिक कोर पर, उसी प्रोसेसर के अन्य भौतिक कोर पर या किसी अन्य प्रोसेसर के कोर पर, जो समान सुसंगतता डोमेन साझा करता है, के व्यवहार के आधार पर इससे प्रभावी रूप से लाभ नहीं ले सकता है। । पिनिंग, प्राथमिकता बढ़ाने, कैट-आधारित कैश विभाजन, और हाइपरथ्रेडिंग को अक्षम करने जैसी तकनीकें उस धागे को कुशलता से चलाने में मदद कर सकती हैं। यह भी ध्यान दें कि PREFETCHNTA को एक सट्टा लोड के रूप में वर्गीकृत किया गया है और इसलिए यह तीन बाड़ निर्देशों के साथ समवर्ती है।





prefetch