परमाणु संचालन लागत


90

परमाणु संचालन (तुलना-और-स्वैप या परमाणु जोड़ / घटाव में से कोई भी) की लागत क्या है? कितना चक्र का उपभोग करता है? क्या यह SMP या NUMA पर अन्य प्रोसेसर को रोक देगा, या यह मेमोरी एक्सेस को ब्लॉक कर देगा? क्या यह आउट-ऑफ-ऑर्डर सीपीयू में फिर से बफर को फ्लश करेगा?

कैश पर क्या होगा असर?

मुझे आधुनिक, लोकप्रिय सीपीयू में दिलचस्पी है: x86, x86_64, PowerPC, SPARC, Itanium।


@ जैसन एस, कोई भी। कैस और परमाणु inc / dec के बीच का अंतर नगण्य है।
ऑक्सक्स

2
एक x86 पर परमाणु संचालन धीमा हो जाता है क्योंकि स्मृति पते पर अधिक विवाद रखा जाता है। मेरा मानना ​​है कि सामान्य रूप से वे गैर-लॉक किए गए ऑपरेशन की तुलना में परिमाण के एक क्रम के आसपास हैं, लेकिन स्पष्ट रूप से यह उपयोग किए जाने वाले ऑपरेशन, विवाद और मेमोरी बाधाओं के आधार पर अलग-अलग होगा।
स्टीफन न्यूट

हममम। लिखते हैं x86 पर परमाणु लगता है। 'लिनक्स कर्नेल को समझना' -> spin_unlock
osgx

एक 32 बिट लेखन जावा में परमाणु है, यानी यह आंशिक रूप से परमाणु है (लेकिन इसमें कोई मेमोरी बाधा शब्दार्थ नहीं है, इसलिए यह अक्सर संकेत के लिए पर्याप्त नहीं है)। 1 जोड़ना आम तौर पर परमाणु नहीं है, जब तक कि आप लॉक उपसर्ग नहीं जोड़ते हैं। लिनक्स कर्नेल के बारे में, spin_unlock को देखने की कोई आवश्यकता नहीं है। देखें, वर्तमान रिलीज़ में, आर्च / x86 / / / asm / atomic_32.h (इसमें शामिल / asm-i386 / atomic.h शामिल था)।
ब्लिसोरब्लेड

@ ब्लेज़रब्लड, जेएएवा यहाँ नहीं है। लॉक्ड ऑपरेशन की लागत क्या है?
21

जवाबों:


59

मैंने पिछले दिनों के वास्तविक आंकड़ों की तलाश की, और कुछ भी नहीं पाया। हालाँकि, मैंने कुछ शोध किए, जो कि परमाणु की लागत की तुलना कैश मिस की लागत से करता है।

lock cmpxchgPentiumPro (जैसा कि डॉक्टर में वर्णित है) से पहले x86 LOCK उपसर्ग, ( परमाणु कैस सहित ) की लागत , एक मेमोरी एक्सेस (जैसे कैश मिस) है, + अन्य प्रोसेसर द्वारा मेमोरी ऑपरेशन को रोकना, + अन्य प्रोसेसर के साथ कोई विवाद। बस को लॉक करने की कोशिश की जा रही है। हालाँकि, पेंटियमप्रो के बाद से, सामान्य राइटबैक कैचेबल मेमोरी के लिए (सभी मेमोरी एक ऐप डील करती है, जब तक कि आप हार्डवेयर के साथ सीधे बात नहीं करते हैं), सभी मेमोरी ऑपरेशंस को ब्लॉक करने के बजाय, केवल संबंधित कैशे लाइन को ब्लॉक किया जाता है ( @ osgx के उत्तर में लिंक के आधार पर ) ।

यानी वास्तविक lockएड ऑपरेशन के स्टोर भाग के बाद लाइन के लिए MESI शेयर और RFO अनुरोधों का जवाब देने में देरी । इसे "कैश लॉक" कहा जाता है, और केवल उस एक कैश लाइन को प्रभावित करता है। अन्य कोर एक ही समय में अन्य लाइनों को लोड / स्टोर या लोड कर सकते हैं।


वास्तव में, सीएएस मामला अधिक जटिल हो सकता है, जैसा कि इस पृष्ठ पर समझाया गया है , जिसमें कोई समय नहीं है, लेकिन एक भरोसेमंद इंजीनियर द्वारा एक व्यावहारिक विवरण। (कम से कम सामान्य उपयोग-मामले के लिए जहां आप वास्तविक कैस से पहले एक शुद्ध लोड करते हैं।)

बहुत अधिक विस्तार में जाने से पहले, मैं कहूंगा कि LOCKed ऑपरेशन में एक कैश मिस + एक ही कैशलाइन पर अन्य प्रोसेसर के साथ संभावित विवाद होता है, जबकि CAS + पूर्ववर्ती लोड (जो म्यूटेक्स को छोड़कर लगभग हमेशा आवश्यक होता है, जहां आप हमेशा होते हैं कैस 0 और 1) में दो कैशे छूट सकते हैं।

वह बताते हैं कि एक स्थान पर एक लोड + कैस वास्तव में लोड-लिंक्ड / स्टोर-कंडिशनल (बाद के लिए वहां देखें) की तरह दो कैश मिसेज़ खर्च कर सकता है। उनका स्पष्टीकरण MESI कैश सुसंगत प्रोटोकॉल के ज्ञान पर निर्भर करता है । यह एक कैशलाइन के लिए 4 राज्यों का उपयोग करता है: M (ओडीफाइड), E (xclusive), S (hared), I (nvalid) (और इसलिए इसे MESI कहा जाता है), नीचे समझाया गया है जहां जरूरत है। परिदृश्य, समझाया गया है, निम्नलिखित है:

  • LOAD कैश मिस होने का कारण बनता है - संबंधित कैशलाइन को साझा स्थिति में मेमोरी से लोड किया जाता है (अर्थात अन्य प्रोसेसर को अभी भी उस कैशलाइन को मेमोरी में रखने की अनुमति है; इस राज्य में कोई भी बदलाव की अनुमति नहीं है)। यदि स्थान मेमोरी में है, तो यह कैश मिस छोड़ दिया जाता है। संभावित लागत: 1 कैश मिस। (छोड़ दिया गया है, तो कैशलाइन साझा, अनन्य या संशोधित स्थिति में है, अर्थात डेटा इस CPU के L1 कैश में है)।
  • कार्यक्रम स्टोर करने के लिए नए मूल्यों की गणना करता है,
  • और यह एक परमाणु कैस अनुदेश चलाता है।
    • इसे समवर्ती संशोधन से बचना है, इसलिए इसे कैशलाइन को अन्य सीपीयू के कैश से हटा देना चाहिए, कैशलाइन को विशेष राज्य में स्थानांतरित करने के लिए। संभावित लागत: 1 कैश मिस। यह विशेष रूप से पहले से ही स्वामित्व में है, यानी विशेष या संशोधित राज्य में, इसकी आवश्यकता नहीं है। दोनों राज्यों में, कोई अन्य सीपीयू कैशलाइन नहीं रखता है, लेकिन विशेष राज्य में इसे संशोधित नहीं किया गया है (अभी तक)।
    • इस संचार के बाद, चर हमारे सीपीयू के स्थानीय कैश में संशोधित किया जाता है, जिस बिंदु पर यह अन्य सभी सीपीयू के लिए विश्व स्तर पर दिखाई देता है (क्योंकि उनके कैश हमारे साथ सुसंगत हैं)। यह अंततः सामान्य एल्गोरिदम के अनुसार मुख्य मेमोरी में लिखा जाएगा।
    • उस चर को पढ़ने या संशोधित करने का प्रयास करने वाले अन्य प्रोसेसर को पहले उस कैशलाइन को साझा या अनन्य मोड में प्राप्त करना होगा, और ऐसा करने के लिए वह इस प्रोसेसर से संपर्क करेगा और कैशलाइन का अद्यतन संस्करण प्राप्त करेगा। इसके बजाय एक लॉक्ड ऑपरेशन, केवल कैश मिस का खर्च कर सकता है (क्योंकि सीधे विशेष राज्य में कैशलाइन का अनुरोध किया जाएगा)।

सभी मामलों में, पहले से ही डेटा को संशोधित करने वाले अन्य प्रोसेसर द्वारा एक कैशलाइन अनुरोध को रोक दिया जा सकता है।


1 कैश मिस के रूप में अन्य सीपीयू पर राज्य का जप क्यों किया जाता है?
ऑक्सक्स

1
क्योंकि यह CPU के बाहर संचार है, और इस तरह कैश तक पहुँचने से धीमा है। जबकि एक कैश मिस को अन्य सीपीयू से वैसे भी गुजरना पड़ता है। वास्तव में, यह मामला हो सकता है कि किसी अन्य सीपीयू के साथ बात करना मेमोरी के साथ बात करने की तुलना में तेज है, अगर एक सीधा इंटरकनेक्शन का उपयोग किया जाता है, जैसे कि एएमडी हाइपरट्रांसपोर्ट (एक विशाल समय पहले), या इंटेल क्विकपैथ इंटरकनेक्ट इंटेल से, बहुत नवीनतम एक्सॉन प्रोसेसर पर नेहेलम पर आधारित है। अन्यथा अन्य CPU के साथ संचार उसी FSB पर होता है जो मेमोरी के लिए होता है। अधिक जानकारी के लिए विकिपीडिया पर हाइपरट्रांसपोर्ट और फ्रंट साइड बस की खोज करें।
Blaisorblade

वाह, कभी नहीं सोचा था कि उसका इतना महंगा है - एक कैश मिस कुछ हजारों चक्र हो सकता है।
लोथर

2
वास्तव में? यह आंकड़ा मैं उपयोग कर रहा हूं: कैश मिस के लिए एक सौ चक्र, और संदर्भ / विशेषाधिकार स्विच (सिसॉलस सहित) के लिए हजारों चक्र।
ब्‍लॉसरब्‍लेड

1
कैश मिस कुछ हजार चक्र नहीं है! इसके बारे में 100ns, जो आमतौर पर 300-350 सीपीयू चक्र है ....
user997112

37

मैंने निम्नलिखित सेटअप के साथ कुछ रूपरेखा तैयार की: परीक्षण मशीन (AMD Athlon64 x2 3800+) को बूट किया गया, लंबे मोड (इंटरप्ट अक्षम) पर स्विच किया गया और ब्याज का निर्देश एक लूप में निष्पादित किया गया, 100 पुनरावृत्तियों को नियंत्रित किया गया और 1,000 लूप चक्र। लूप बॉडी को 16 बाइट्स से जोड़ा गया था। लूप से पहले और बाद में rdtsc निर्देश के साथ समय को मापा गया था। इसके अतिरिक्त बिना किसी निर्देश के एक डमी लूप निष्पादित किया गया था (जिसमें प्रति लूप पुनरावृत्ति के लिए 2 चक्र और बाकी के लिए 14 चक्र मापा गया था) और परिणाम को निर्देश रूपरेखा समय के परिणाम से हटा दिया गया था।

निम्नलिखित निर्देशों को मापा गया था:

  • " lock cmpxchg [rsp - 8], rdx(तुलना मैच और बेमेल दोनों),
  • " lock xadd [rsp - 8], rdx",
  • " lock bts qword ptr [rsp - 8], 1"

सभी मामलों में मापा गया समय लगभग 310 चक्र था, त्रुटि +/- 8 चक्र के बारे में थी

यह उसी (कैश्ड) मेमोरी पर बार-बार निष्पादन के लिए मूल्य है। अतिरिक्त कैश मिस के साथ, समय काफी अधिक है। इसके अलावा यह केवल 2 कोर सक्रिय में से एक के साथ किया गया था, इसलिए कैश विशेष रूप से स्वामित्व में था, और कोई कैश सिंक्रोनाइजेशन की आवश्यकता नहीं थी।

कैश मिस पर लॉक किए गए निर्देश की लागत का मूल्यांकन करने के लिए, मैंने wbinvldलॉक किए गए निर्देश से पहले एक निर्देश जोड़ा और wbinvldप्लस add [rsp - 8], raxको तुलना लूप में डाल दिया । दोनों मामलों में लागत प्रति निर्देश जोड़ी के बारे में 80,000 चक्र था! लॉक बीटी के मामले में समय अंतर लगभग 180 चक्र प्रति निर्देश था।

ध्यान दें कि यह पारस्परिक थ्रूपुट है, लेकिन चूंकि लॉक किए गए ऑपरेशन धारावाहिक संचालन हैं, शायद विलंबता में कोई अंतर नहीं है।

निष्कर्ष: एक बंद ऑपरेशन भारी है, लेकिन एक कैश मिस बहुत भारी हो सकता है। इसके अलावा: एक लॉक किए गए ऑपरेशन से कैश मिस नहीं होता है। यह केवल कैश सिंक्रनाइज़ेशन ट्रैफ़िक का कारण बन सकता है, जब कोई कैशलाइन विशेष रूप से स्वामित्व में नहीं है।

मशीन को बूट करने के लिए, मैंने ReactOS प्रोजेक्ट से FreeLdr के x64 संस्करण का उपयोग किया। यहाँ asm स्रोत कोड है:

#define LOOP_COUNT 1000
#define UNROLLED_COUNT 100

PUBLIC ProfileDummy
ProfileDummy:

    cli

    // Get current TSC value into r8
    rdtsc
    mov r8, rdx
    shl r8, 32
    or r8, rax

    mov rcx, LOOP_COUNT
    jmp looper1

.align 16
looper1:

REPEAT UNROLLED_COUNT
    // nothing, or add something to compare against
ENDR

    dec rcx
    jnz looper1

    // Put new TSC minus old TSC into rax
    rdtsc
    shl rdx, 32
    or rax, rdx
    sub rax, r8

    ret

PUBLIC ProfileFunction
ProfileFunction:

    cli

    rdtsc
    mov r8, rdx
    shl r8, 32
    or r8, rax
    mov rcx, LOOP_COUNT

    jmp looper2

.align 16
looper2:

REPEAT UNROLLED_COUNT
    // Put here the code you want to profile
    // make sure it doesn't mess up non-volatiles or r8
    lock bts qword ptr [rsp - 8], 1
ENDR

    dec rcx
    jnz looper2

    rdtsc
    shl rdx, 32
    or rax, rdx
    sub rax, r8

    ret

धन्यवाद! क्या आप अपना टेस्ट कोड या टेस्ट Core2 / Core i3 / i5 / i7 स्वयं प्रकाशित कर सकते हैं? क्या आपके परीक्षण सेटअप में सभी कोर प्रारंभिक थे?
23

मैंने सोर्स कोड जोड़ा है। केवल एक कोर को इनिशियलाइज़ किया गया था। अन्य मशीनों से परिणाम देखना पसंद करेंगे।
टिमो

पूरी कैश की WBINVD की तुलना में कैश लाइन को फ्लश करने के लिए CLFLUSH एक बहुत हल्का तरीका होना चाहिए। WBINVD इंस्ट्रक्शन-कैश को भी फ्लश करेगा, जिससे अतिरिक्त कैश मिस हो जाएगा।
पीटर कॉर्ड्स

शायद साझा राज्य में कैश लाइन के गर्म होने के मामले का परीक्षण करना दिलचस्प है। आप ऐसा कर सकते हैं कि एक शुद्ध धागा के साथ एक और धागा पढ़ा जाए।
पीटर कॉर्ड्स

4

बस-आधारित एसएमपी पर, परमाणु उपसर्ग LOCKएक बस वायर सिग्नल को मुखर (चालू) करता है LOCK#। इसका उपयोग करने के लिए यह बस पर अन्य सीपीयू / उपकरणों को प्रतिबंधित करेगा।

Ppro और P2 पुस्तक http://books.google.com/books?id=3gDmyIYvFH4C&pg=PA245&dq=lock+instruction+pentium&lr=&ei=_E61S5ehLa78zQSzrqwI&cd=1#v=onepage&q=lock%20instruction%20instruction%20 पुनर्निर्माण बाधा

लॉक किए गए निर्देश क्रमबद्ध कर रहे हैं , संचालन को सिंक्रनाइज़ कर रहे हैं .... / आउट-ऑफ-ऑर्डर / लॉक आरएमडब्ल्यू / रीड-संशोधित-राइट = परमाणु स्वयं / निर्देश यह सुनिश्चित करता है कि प्रोसेसर इसे निष्पादित करने से पहले लॉक किए गए निर्देश से पहले सभी निर्देशों को निष्पादित करेगा। / के बारे में अभी तक नहीं लिखा है flushed / यह अगले निर्देश को निष्पादित करने से पहले सभी पोस्ट लिखता है कि प्रोसेसर के भीतर बाहरी मेमोरी में प्लावित किया जाता है।

एसएमपी / सेमाफोर के बारे में एस राज्य में कैश में है ... 0 बाइट्स के लिए एक पठन और अमान्य लेनदेन जारी करना (यह आसन्न सीपीयू में कैश लाइन की साझा प्रतियों की एक हत्या / है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.