क्या करता है "प्रतिनिधि; nop, " x86 विधानसभा में मतलब है? क्या यह "ठहराव" निर्देश के समान है?


86
  • क्या rep; nopमतलब है?
  • क्या यह pauseनिर्देश के समान है ?
  • क्या यह rep nop(अर्ध-उपनिवेश के बिना) समान है?
  • सरल nopनिर्देश में क्या अंतर है ?
  • क्या यह AMD और Intel प्रोसेसर पर अलग तरह से व्यवहार करता है?
  • (बोनस) इन निर्देशों के लिए आधिकारिक दस्तावेज कहां है?

इस प्रश्न के लिए प्रेरणा

एक अन्य प्रश्न की टिप्पणियों में कुछ चर्चा के बाद , मुझे एहसास हुआ कि मुझे पता नहीं है कि rep; nop;x86 (या x86-64) विधानसभा में क्या मतलब है। और मुझे वेब पर एक अच्छी व्याख्या भी नहीं मिली।

मुझे पता है कि repयह एक उपसर्ग है जिसका अर्थ है "अगले अनुदेश के cxसमय को दोहराएं " (या कम से कम यह पुराने 16-बिट x86 विधानसभा में था)। इस के अनुसार विकिपीडिया पर सारांश तालिका , ऐसा लगता है repकेवल के साथ इस्तेमाल किया जा सकता movs, stos, cmps, lods, scas(लेकिन शायद इस सीमा नए प्रोसेसर पर हटा दिया गया था)। इस प्रकार, मुझे लगता है कि rep nop(अर्ध-बृहदान्त्र के बिना) एक nopऑपरेशन के cxसमय को दोहराएगा ।

हालाँकि, आगे की खोज के बाद, मैं और भी उलझन में पड़ गया। ऐसा लगता है कि rep; nopऔर pause बिल्कुल एक ही opcode के लिए मानचित्र , और pauseबस की तुलना में थोड़ा अलग व्यवहार है nop2005 के कुछ पुराने मेल ने अलग-अलग बातें कही:

  • "बहुत अधिक बिजली न जलाने की कोशिश करें"
  • "यह सिर्फ 2 बाइट एन्कोडिंग के साथ 'एनओपी' के बराबर है।"
  • "यह जादू पर जादू है। इसकी तरह 'शून्य लेकिन दूसरे एचटी भाई को चलाने दो"
  • "यह एथलोन पर इंटेल और तेज़ पैडिंग पर रोक है"

इन विभिन्न मतों के साथ, मैं इसका सही अर्थ नहीं समझ सका।

लिनक्स कर्नेल में इसका उपयोग किया जा रहा है ( i386 और x86_64 दोनों पर ), इस टिप्पणी के साथ: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */इसका उपयोग BeRTOS में भी किया जा रहा है , उसी टिप्पणी के साथ।


जवाबों:


75

rep; nopवास्तव में pauseनिर्देश (opcode F390) जैसा ही है । इसका उपयोग असेंबलरों के लिए किया जा सकता है जो pauseअभी तक निर्देश का समर्थन नहीं करते हैं । पिछले प्रोसेसर पर, यह बस कुछ नहीं किया, बस nopदो बाइट्स की तरह। नए प्रोसेसर पर जो हाइपरथ्रेडिंग का समर्थन करते हैं, इसका उपयोग उस प्रोसेसर के संकेत के रूप में किया जाता है जिसे आप प्रदर्शन बढ़ाने के लिए स्पिनलूप निष्पादित कर रहे हैं। से इंटेल की शिक्षा संदर्भ :

स्पिन-प्रतीक्षा छोरों के प्रदर्शन में सुधार करता है। "स्पिन-वेट लूप" निष्पादित करते समय, पेंटियम 4 या इंटेल ज़ीओन प्रोसेसर लूप से बाहर निकलते समय एक गंभीर प्रदर्शन जुर्माना करता है क्योंकि यह एक संभावित मेमोरी ऑर्डर उल्लंघन का पता लगाता है। PAUSE निर्देश प्रोसेसर को एक संकेत प्रदान करता है कि कोड अनुक्रम एक स्पिन-वेट लूप है। प्रोसेसर ज्यादातर स्थितियों में मेमोरी ऑर्डर उल्लंघन से बचने के लिए इस संकेत का उपयोग करता है, जो प्रोसेसर के प्रदर्शन को बेहतर बनाता है। इस कारण से, यह अनुशंसा की जाती है कि सभी स्पिन-प्रतीक्षा छोरों में एक PAUSE निर्देश रखा जाए।


4
है स्पिन प्रतीक्षा पाश के रूप में ही व्यस्त प्रतीक्षा पाश ? क्या यह "सुधार" केवल हाइपरथ्रेडिंग प्रोसेसर पर लागू होता है? (और क्यों?)
डेनिलसन सिया मिया

11
हां, स्पिन-वेट लूप व्यस्त-वेट लूप के समान है। लाभ सीपीयू पर भी लागू होता है जो हाइपर-थ्रेडिंग का समर्थन नहीं करता है। इसे पाइपलाइन में (अनावश्यक) निर्देशों की संख्या को सीमित करने के बजाय (समानांतर में लूप के कई पुनरावृत्तियों को करने का प्रयास करने के रूप में) सोचा जा सकता है
ब्रेंडन

1
@ ब्रेंडन, धन्यवाद! मुझे बिल्कुल भी समझ नहीं आया, जब तक कि आप समानांतर में लूप के पुनरावृत्तियों के बारे में बात नहीं करते।
प्रो। फॉकन

11
@ ब्रेंडन, ओह, अब मैं समझ गया! ये आधुनिक प्रोसेसर सुपरसेलकर हैं , और इस प्रकार वे एक ही समय में कई निर्देश चलाने का प्रयास करेंगे। यदि यह एक व्यस्त-प्रतीक्षा लूप है, तो अधिक निर्देश चलाने से यह अधिक तेज़ नहीं होगा, क्योंकि यह सिर्फ एक और स्थिति की प्रतीक्षा कर रहा है।
डेनिलसन सा माया

1
@ डिएनल्सन: हाँ, हाइपरथ्रेडिंग-मित्रता (या एचटी के बिना सिर्फ बिजली की बचत) एक बड़ा लाभ है, लेकिन दूसरा स्पिन-लूप छोड़ने पर एक मेमोरी-ऑर्डर मिस-सट्टा से बच रहा है। बिना pause, आपका स्पिन-लूप प्रभावी रूप से एक पाइपलाइन-स्पष्ट धीमा है जो किसी अन्य कोर द्वारा लिखित मेमोरी स्थान के राज्य-परिवर्तन को नोटिस करने के लिए है।
पीटर कॉर्ड्स

14

rep nop= F3 90 = एन्कोडिंग pause, साथ ही साथ यह पुराने CPU पर डिकोड कैसे करता है जो समर्थन नहीं करते हैं pause


उपसर्ग (अन्य के अलावा lock) जो एक निर्देश पर लागू नहीं होते हैं उन्हें मौजूदा सीपीयू द्वारा अभ्यास में अनदेखा किया जाता है।

प्रलेखन का कहना है कि repनिर्देशों के साथ यह लागू नहीं होता है "आरक्षित है और अप्रत्याशित व्यवहार का कारण बन सकता है" क्योंकि भविष्य के सीपीयू इसे कुछ नए निर्देशों के हिस्से के रूप में पहचान सकते हैं। एक बार जब वे किसी विशिष्ट नए अनुदेश एन्कोडिंग का उपयोग कर स्थापित करते हैं f3 xx, तो वे दस्तावेज़ करते हैं कि यह पुराने सीपीयू पर कैसे चलता है। (हां, x86 ओपोड स्पेस इतना सीमित है कि वे इस तरह से पागल सामान करते हैं, और हाँ यह डिकोडर्स को जटिल बनाता है।)

इस मामले में, इसका मतलब है कि आप pauseबैकवर्ड कंप्रेशर्स को तोड़े बिना स्पिनलूप में उपयोग कर सकते हैं । पुराने CPU जो इसके बारे में नहीं जानते हैं, pauseउन्हें बिना किसी नुकसान के NOP के रूप में डिकोड किया जाएगा, जैसा कि Intel के ISA रेफ मैन्युअल प्रविष्टि के लिएpause गारंटी देता है । नए CPU पर, आपको पावर-सेविंग / HT मित्रता का लाभ मिलता है, और मेमोरी-ऑर्डर गलत-अटकलों से बचने के लिए जब आप जिस मेमोरी पर स्पिन कर रहे होते हैं वह परिवर्तन नहीं करता है और आप स्पिन लूप छोड़ देते हैं।


इंटेल के मैनुअल के लिंक और x86 टैग विकी जानकारी पृष्ठ पर अन्य अच्छे सामान के टन

अर्थहीन repउपसर्ग का एक और मामला नए CPU पर एक नया निर्देश बनता है: lzcntहै F3 0F BD /r। उस निर्देश का समर्थन न करने वाले CPU पर (उनके CPUID में LZCNT सुविधा ध्वज को याद करते हुए), यह rep bsrउसी तरह से डिकोड करता है , जो उसी प्रकार चलता है bsr। पुराने सीपीयू पर, यह उत्पादन करता है 32 - expected_result, और इनपुट शून्य होने पर अपरिभाषित होता है।

लेकिन tzcntऔर bsfगैर-शून्य इनपुट के साथ एक ही काम करते हैं, इसलिए कंपाइलर उपयोग कर सकते हैं और tzcntयहां तक ​​कि जब यह गारंटी नहीं है कि लक्ष्य सीपीयू इसे चलाएगा tzcnt। एएमडी सीपीयू में तेज tzcnt, धीमी गति bsfसे और इंटेल पर वे दोनों तेज हैं। जब तक यह शुद्धता के लिए मायने नहीं रखता है (आप ध्वज-सेटिंग पर निर्भर नहीं हैं, या इनपुट = 0 मामले में गंतव्य को अनधिकृत व्यवहार छोड़ने पर), यह tzcntसीपीयू के रूप में डिकोड करता है जो इसे समर्थन करता है।


एक अर्थहीन के एक मामले की repउपसर्ग कि शायद कभी नहीं डिकोड अलग ढंग से होगा: rep ret(यानी के साथ एक विशिष्ट सीपीयू लक्ष्यीकरण नहीं जब "सामान्य" सीपीयू को लक्षित जीसीसी द्वारा डिफ़ॉल्ट रूप से प्रयोग किया जाता है -marchया -mtune।, और एएमडी K8 या K10 लक्ष्यीकरण नहीं) यह किसी से पहले दशकों हो जाएगा एक सीपीयू बना सकता है जो कि rep retइसके अलावा और कुछ के रूप में डिकोड करता है ret, क्योंकि यह अधिकांश लिनक्स डिस्ट्रोयस में अधिकांश बायनेरिज़ में मौजूद है। देखें कि `रेप रेट` का क्या अर्थ है?


3
repउपसर्ग भी ताला इलिजन जोड़ने के लिए इंटेल द्वारा इस्तेमाल किया गया था।
पॉल ए। क्लेटन

किसी निर्देश पर लागू न होने वाले उपसर्गों को अनदेखा कर दिया जाता है। लेकिन यह उल्लेख किया गया है कि बार-बार उपसर्गों ( F2Hऔर F3H) सुरक्षित और अप्रत्याशित व्यवहार में हो सकता है में टेबल 11-3। SSE, SSE2 और SSE3 निर्देशों पर उपसर्गों का प्रभाव । इसलिए उपसर्ग एप्लिकेशन को कुछ निर्देशों के लिए अनदेखा किया जाता है, सभी के लिए नहीं। तो क्या इस सुविधा को अनिर्दिष्ट माना जाता है?
सेंटऑन्टारियो

2
@ सेंटऑनारियो: वे इसे इस तरह से वाक्यांश देते हैं क्योंकि भविष्य के सीपीयू इसे कुछ नए निर्देश के भाग के रूप में पहचान सकते हैं। सभी वास्तविक सीपीयू पर, यही स्थिति रही है, और एक बार जब f3 xxवे दस्तावेज़ का उपयोग करके एन्कोडिंग स्थापित करते हैं तो यह पुराने सीपीयू पर कैसे चलता है।
पीटर कॉर्ड्स

1
उपसर्ग (लॉक के अलावा) जो एक निर्देश पर लागू नहीं होते हैं उन्हें मौजूदा सीपीयू द्वारा अभ्यास में अनदेखा किया जाता है। इसका rep movbeकारण यह है कि हमेशा अनदेखा नहीं किया जाता है #UD, यह प्रलेखित है । भले ही यह इस अर्थ में एक निर्देश पर लागू नहीं होता है क्योंकि यह मैनुअल प्रविष्टि में निर्दिष्ट है । repREP/REPE/REPZ/REPNE/REPNZ
सेंटऑनारियो

2
@ सेंटअनारियो: दिलचस्प! हालांकि सामान्य तौर पर, पुराने निर्देशों के लिए गैर-लागू उपसर्गों को अनदेखा किया जाता है। एक नया निर्देश शुरू करते समय यदि वे चुनते हैं तो कठोर नियमों को जोड़ना संभव है। आईडीके इस विशिष्ट मामले के लिए उन्हें क्यों चुनेंगे।
पीटर कॉर्डेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.