2011-09-10 11 views
5

के संदर्भ में स्पिन लूप का ओवरहेड कहें एक कोर में एक थ्रेड एक चर पर कताई कर रहा है जिसे किसी अन्य कोर पर चलने वाले थ्रेड द्वारा अपडेट किया जाएगा। मेरा सवाल है कैश स्तर पर ओवरहेड क्या है। क्या प्रतीक्षा धागा परिवर्तनीय को कैश करेगा और इसलिए जब तक लेखन धागे उस चर को लिखता है तब तक बस पर कोई ट्रैफ़िक नहीं होता है?कैश समेकन

यह ओवरहेड कैसे कम किया जा सकता है। क्या x86 pause निर्देश सहायता है?

+0

मुझे लगता है कि आप एसएमपी का जिक्र कर रहे हैं? –

+0

हां एली, मैं एसएमपी सिस्टम का जिक्र कर रहा हूं। – MetallicPriest

उत्तर

3

मेरा मानना ​​है कि सभी आधुनिक x86 CPUs MESI protocol का उपयोग करते हैं। तो कताई "पाठक" थ्रेड में "अनन्य" या "साझा" मोड में डेटा की कैश की गई प्रतिलिपि होगी, जिससे आप स्पिन करते समय कोई मेमोरी बस यातायात उत्पन्न नहीं करेंगे।

यह तब होता है जब दूसरा कोर उस स्थान पर लिखता है जिसे इसे क्रॉस-कोर संचार करना होगा।

[अद्यतन]

एक इस तरह "spinlock" अगर आप बहुत लंबे समय के लिए कताई नहीं किया जाएगा केवल एक अच्छा विचार है। यदि यह चर हो जाने से पहले कुछ समय हो सकता है, तो इसके बजाय एक म्यूटेक्स + कंडीशन वैरिएबल का उपयोग करें, जो आपके धागे को सोने के लिए रखेगा ताकि यह प्रतीक्षा न होने पर कोई ओवरहेड न जोड़ सके। वैसे भी यह

+0

"मेरा मानना ​​है कि सभी आधुनिक x86 CPUs एमईएसआई प्रोटोकॉल का उपयोग करते हैं।" - आप इसमें क्यों विश्वास करते हैं? मुझे लगता है कि AMD64 MOESI है, इंटेल का numa (i *) MESIF है। – osgx

+0

@osgx: क्योंकि आखिरी बार मैंने इसके बारे में 5-10 साल पहले पढ़ा था? मुझे नहीं लगता कि यह मूल उत्तर बदलता है, लेकिन जानकारी के लिए धन्यवाद। – Nemo

1

यदि आप छोटे अंतराल के लिए लॉक स्पिन करते हैं तो आप आमतौर पर ठीक होते हैं। हालांकि लिनक्स पर एक टाइमर इंटरप्ट होता है (और मैं अन्य ओएस पर समान मानता हूं) ताकि यदि आप 10 एमएस के लिए लॉक स्पिन करते हैं या इसके करीब आपको कैश परेशानी दिखाई देगी।

मैंने विशिष्ट कोर पर सभी इंटरप्ट को रोकने के लिए लिनक्स कर्नेल को संशोधित करना संभव सुना है और यह परेशानी दूर हो गई है, लेकिन मुझे नहीं पता कि ऐसा करने में क्या शामिल है।

+0

मुझे लगता है कि आरएचईएल 5 ने [आईआरक्यू बाइंडिंग] की अनुमति दी है (http://rt.et.redhat.com/wiki/index.php?title=RHEL-RT_AffinityHowto&printable=yes#IRQ_.28interrupt.29_binding) कमांड लाइन ऐप के माध्यम से। –

+0

सच है, लेकिन "स्थानीय टाइमर इंटरप्ट्स" को स्थानांतरित नहीं किया जा सकता है क्योंकि यह प्रति सेकंड कम से कम 100 बार कभी थ्रेड में बाधा डालता है। (इसे उच्च कॉन्फ़िगर किया जा सकता है) यदि आप जानते हैं कि इसे कैसे बंद करें, तो मुझे बहुत दिलचस्पी होगी। ;) –

0

दो धागे भूमि के ऊपर के मामले में अनदेखी हो सकती है,

(सोच रहे हैं संयोग से, मैं बहुत से लोगों को संदेह है - - मेरे सहित "क्या आप वास्तव में क्या करने के लिए कोशिश कर रहे हैं?") एक अच्छा विचार हो सकता है एक साधारण बेंचमार्क बनाओ। उदाहरण के लिए, यदि आप स्पिनलॉक्स को लागू करते हैं, तो थ्रेड स्पिन में कितना समय व्यतीत करता है। कैश पर यह प्रभाव कैश लाइन बाउंसिंग कहलाता है।

0

मैंने इस व्यापक रूप से this post में परीक्षण किया। आम तौर पर ओवरहेड स्पिनलॉक के बस-लॉकिंग घटक द्वारा किया जाता है, आमतौर पर निर्देश "xchg reg, mem" या इसके कुछ संस्करण। चूंकि उस विशेष ओवरहेड से बचा नहीं जा सकता है, इसलिए आपके पास आवृत्ति पर अर्थव्यवस्था का विकल्प है जिसके साथ आप स्पिनलॉक का आह्वान करते हैं और आवश्यक न्यूनतम कार्य राशि आवश्यक करते हैं - एक बार लॉक होने पर - इसे जारी करने से पहले।

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