मैंने पढ़ा है कि x86 का आईएनसी निर्देश परमाणु नहीं है। मेरा सवाल है कि कैसे आते हैं? मान लीजिए कि हम x86-64 पर 64 बिट पूर्णांक बढ़ा रहे हैं, हम इसे एक निर्देश के साथ कर सकते हैं, क्योंकि आईएनसी निर्देश स्मृति मेमोरी दोनों के साथ काम करता है और पंजीकरण करता है। तो यह परमाणु नहीं कैसे आते हैं?कैसे x86 का आईएनसी निर्देश परमाणु नहीं है?
उत्तर
यह क्यों होगा? प्रोसेसर कोर को अभी भी स्मृति स्थान पर संग्रहीत मान को पढ़ने की आवश्यकता है, इसकी वृद्धि की गणना करें, और उसके बाद उसे वापस स्टोर करें। पढ़ने और भंडारण के बीच एक विलंबता है, और इसी समय एक और ऑपरेशन उस स्मृति स्थान को प्रभावित कर सकता था।
बाहर के आदेश निष्पादन के साथ भी, प्रोसेसर कोर पर्याप्त अपने स्वयं के निर्देश ट्रिप हो जाने नहीं 'स्मार्ट' कर रहे हैं और समय अंतराल में इस स्मृति को संशोधित करने के लिए जिम्मेदार नहीं होगा। हालांकि, एक और कोर एक निर्देश जारी कर सकता था जो उस स्थान को संशोधित करता है, एक डीएमए हस्तांतरण उस स्थान को प्रभावित कर सकता था, या अन्य हार्डवेयर ने स्मृति स्थान को किसी भी तरह छुआ था।
आपको "दूसरा ऑपरेशन" का अर्थ क्या है इसके बारे में थोड़ा और स्पष्ट होना चाहिए। निश्चित रूप से एक ही सीपीयू कोर पर कोई अन्य ऑपरेशन नहीं हो सकता है, केवल मेमोरी बस पर चार कोर/सीपीयू या अन्य हार्डवेयर फिडलिंग पर। –
पोस्ट को अपडेट किया गया। – Kaganar
आप वास्तव में एक गारंटीकृत परमाणु आपरेशन नहीं करना चाहते जब तक आप इसे ज़रूरत है, से Agner Fog के Software optimization resources: instruction_tables.pdf (1996 - 2017): एक ताला उपसर्ग के साथ
निर्देश एक लंबे विलंबता है कैश संगठन और संभवतः रैम की गति पर निर्भर करता है। यदि कई प्रोसेसर या कोर या डायरेक्ट मेमोरी एक्सेस (डीएमए) डिवाइस हैं तो सभी लॉक किए गए निर्देश अनन्य एक्सेस के लिए कैश लाइन लॉक करेंगे, जिसमें रैम एक्सेस शामिल हो सकती है। एक LOCK उपसर्ग आमतौर पर एकल-प्रोसेसर सिस्टम पर भी एक सौ घड़ी चक्र से अधिक खर्च करता है। यह मेमोरी ऑपरेंड के साथ एक्ससीएचजी निर्देश पर भी लागू होता है।
यह जानकारी निश्चित रूप से पुरानी है; एक पूरे म्यूटेक्स लॉक/अनलॉक चक्र में एक मशीन पर 90 चक्र से कम समय लगता है, और इसमें कई लॉक-प्रीफिक्स्ड ऑपरेशंस और rdtsc ओवरहेड शामिल है। Rdtsc के बीच एक लॉक इंक निर्देश के साथ परीक्षण, मैं इसे किसी भी समय (एनओपी के रूप में एक ही समय) लेने के लिए भी मापने में असमर्थ था। आधुनिक सीपीयू पर, ऐसा लगता है कि लॉक उपसर्ग समय को तब तक नहीं बढ़ाता जब तक कि स्मृति को अन्य कोरों के साथ वर्तमान में साझा नहीं किया जाता है। –
@ आर .. - x86-64 2003 से उपलब्ध है, इसलिए यह शायद एक कंबल कथन है। मैं सोच रहा हूं कि यह एक लंबित इंटरप्ट/सीटीएक्स स्विच पर कैसे प्रभाव डालेगा। –
@ आर .. ठीक है, 90 से कम और 100 से अधिक नहीं हैं :-) – hirschhornsalz
आधुनिक x86 प्रोसेसर उनके निष्पादन पाइपलाइन "संकलन" x86 निर्देशों के हिस्से के रूप में संचालन के निचले स्तर के सेट में भाग लेते हैं; इंटेल इन UOPs, एएमडी rops कहता है, लेकिन क्या यह करने पर निर्भर करता है कि एकल 86 निर्देश के कुछ प्रकार कई कदम के रूप में सीपीयू में वास्तविक कार्यात्मक इकाइयों द्वारा निष्पादित हो है।
इसका मतलब है, उदाहरण के लिए, कि:
INC EAX
uOp.inc eax
की तरह एक भी "मिनी सेशन 'के रूप में मार डाला जाता है (मुझे ऐसा लगता है कि कॉल - वे उजागर नहीं कर रहे हैं)।
अन्य ऑपरेंड चीजों के लिए की तरह अलग ढंग से दिखाई देगा,:
INC DWORD PTR [ EAX ]
निम्न स्तर के अपघटन हालांकि अधिक दिखाई देगा:
uOp.load tmp_reg, [ EAX ]
uOp.inc tmp_reg
uOp.store [ EAX ], tmp_reg
और इसलिए atomically निष्पादित नहीं है। यदि दूसरी तरफ उपसर्गLOCK INC [ EAX ]
कहकर, परमाणुता आवश्यकता को पूरा करने के लिए पाइपलाइन के "संकलन" चरण को अलग तरीके से विघटित करने के लिए बताएगा।
इसका कारण निश्चित रूप से दूसरों द्वारा वर्णित है - गति; हमेशा जरूरी नहीं होने पर कुछ परमाणु और जरूरी धीमी क्यों करें?
"मिनी-ऑप" अपघटन परमाणुता के लिए अप्रासंगिक है, क्योंकि एक एकल सीपीयू कोर मध्य-निर्देश को बाधित नहीं किया जा सकता है। असल में कोई लॉक उपसर्ग वाला इंक सिंगल-कोर मशीनों पर पूरी तरह से परमाणु है। यह तभी होता है जब अन्य कोर (या अधिक अस्पष्ट रूप से, बस पर अन्य हार्डवेयर) लॉक उपसर्ग की स्मृति को एक्सेस कर सकता है। –
@ आर ..: इस तरह तर्क दिया गया है, एकल कोर पर _any_ संशोधित-mem cpu op परमाणु थे चाहे कोई फर्क नहीं पड़ता। लेकिन यहां तक कि सिंगल-कोर मशीन भी "एकल" नहीं हैं क्योंकि परिधीय के साथ साझा बसमास्टरिंग डीएमए/मेमोरी बसेस कैश समेकन और परमाणु मुद्दों की उपस्थिति सुनिश्चित करते हैं। हमेशा एक से अधिक स्मृति बस ग्राहक है। इसलिए, लोड/स्टोर्स मेमोरी बस स्तर पर हैं, _always_ विघटित होते हैं भले ही वे "एकल" सीपीयू निर्देश के हिस्से के रूप में होते हैं। परमाणुता पर जोर दिया जाना चाहिए (विशेष स्मृति बस पहुंच); सीपीयू लोड/चेंज/स्टोर के रूप में एक संशोधित-एमएम निष्पादित नहीं कर सकता है लेकिन बस लॉक/अनलॉक के साथ ब्रैकेट होना चाहिए। –
@ आर ..: एआरएम सीपीयू, उदाहरण के लिए, स्पष्ट रूप से 'एलडीआरएक्स'/'स्ट्रेक्स' के माध्यम से निर्देश सेट स्तर पर परमाणुता के लिए बस लॉक की आवश्यकता का पर्दाफाश करें। तथ्य से ही x86 में निर्देशों को याद-संशोधित किया गया है, कोई निष्कर्ष निकालने की आवश्यकता समाप्त नहीं कर सकता है। इसके अलावा, सवाल मध्य-निर्देश में बाधा डालने के बारे में नहीं है - यह परमाणुता के समान नहीं है। विघटन उस अर्थ में दृढ़ता से मायने रखता है क्योंकि _single_ निर्देश की स्मृति पहुंच अन्य CPUs के साथ _race_ कर सकती है। निर्देश पूरा होता है (कोई ट्रैप पुनरारंभ करने की आवश्यकता नहीं है) लेकिन परिणाम (बिना 'लॉक' के) अद्वितीय/निर्धारण नहीं है। –
ठीक है, यह _is atomic_ है, अगर आप इसे LOCK के साथ उपसर्ग करते हैं। आम तौर पर यह नहीं है कि कोई क्या चाहता है, हालांकि, क्योंकि यह काफी महंगा है। इसलिए आपको स्पष्ट करना होगा कि आप क्या चाहते हैं। – Damon
एक शब्द: पाइपलाइन –
परमाणु का मतलब यह नहीं है कि यह एक निर्देश है, इसका मतलब है कि यह एक अविभाज्य कार्रवाई है। और मेमोरी ऑपरेंड के साथ 'inc' वह नहीं है, वैसे भी डिफ़ॉल्ट रूप से नहीं। – harold