x86

10

पर वर्ड फायरिंग किस परिस्थिति में x86 पर एक ही सरणी के आसन्न तत्वों को एक साथ दो अलग-अलग धागे लिखने में असुरक्षित है? मैं समझता हूं कि पागल मेमोरी मॉडल के साथ कुछ DS9K- जैसे आर्किटेक्चर पर यह शब्द फाड़ने का कारण बन सकता है, लेकिन x86 एकल बाइट्स पर पता योग्य है। उदाहरण के लिए, डी प्रोग्रामिंग भाषा real में x86 पर 80-बिट फ़्लोटिंग पॉइंट प्रकार है।x86

real[] nums = new real[4]; // Assume new returns a 16-byte aligned block. 
foreach(i; 0..4) { 
    // Create a new thread and have it do stuff and 
    // write results to index i of nums. 
} 

नोट:: ऐसा लगता है कि कुछ करने के लिए सुरक्षित नहीं होगा मुझे पता है कि, भले ही यह सुरक्षित है, यह कभी कभी कैश के साथ झूठी बंटवारे समस्याएं पैदा कर सकता है, प्रदर्शन को धीमा करने के लिए अग्रणी। हालांकि, उपयोग के मामलों में मेरे मन में लिखने के लिए अभ्यास में कोई फर्क नहीं पड़ता इसके लिए पर्याप्त कम होगा।

संपादित करें: लिखे गए मानों को वापस पढ़ने के बारे में चिंता न करें। धारणा यह है कि किसी भी मान को पढ़ने से पहले सिंक्रनाइज़ेशन हो जाएगा। मुझे इस तरह से की सुरक्षा की परवाह है।

+0

मुझे लगता है कि आप आसन्न पते के गंदे लिख रहे हैं? – BCS

उत्तर

10

x86 में सुसंगत कैश हैं। एक कैश लाइन को लिखने के लिए अंतिम प्रोसेसर पूरी चीज प्राप्त करता है और कैश को लिखता है। यह सुनिश्चित करता है कि संबंधित मानों पर लिखे गए एकल बाइट और 4 बाइट मान परमाणु रूप से अद्यतन किया गया है।

यह "इसकी सुरक्षित" से अलग है। यदि प्रोसेसर प्रत्येक डिजाइनर द्वारा उस प्रोसेसर द्वारा "स्वामित्व" बाइट्स/DWORDS को केवल "लिखते हैं, तो अपडेट सही होंगे। प्रैक्टिस में, आप चाहते हैं कि एक प्रोसेसर दूसरों द्वारा लिखे गए मानों को पढ़ सके, और इसके लिए सिंक्रनाइज़ेशन की आवश्यकता है।

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

+0

पढ़ने के बारे में आपके बिंदु के बारे में: विचार समानांतर मानचित्र जैसे कुछ का उपयोग करके समानांतर में एक विशाल सरणी भरना था। मैपिंग फ़ंक्शन में अधिकांश समय लगेगा, जैसे कि समय बिताया गया समय नगण्य है, और कैश लाइनों को किसी भी तरह से कार्य इकाइयों की सीमाओं के निकट ही साझा किया जाएगा। इस सरणी से किसी भी मान को वापस पढ़ने से पहले, किसी प्रकार का सिंक्रनाइज़ेशन का उपयोग किया जाएगा। – dsimcha

1

मुझे कुछ याद आ रहा है, लेकिन मुझे कोई समस्या नहीं है। x86 आर्किटेक्चर केवल वही लिखता है जो इसे चाहिए, यह निर्दिष्ट मानों के बाहर कोई लेखन नहीं करता है। कैश-स्नूपिंग कैश के मुद्दों को संभालती है।

1

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

x86 के संबंध में, संचालन की परमाणुता Intel's Software Developer's Manual Volume 3A की धारा 8.1 में निर्दिष्ट है। इसके अनुसार, परमाणु स्टोर परिचालन में शामिल हैं: एक बाइट संग्रहित करना, शब्द-संरेखित शब्द और सभी x86 CPUs पर dword-aligned dword संग्रह करना। यह भी निर्दिष्ट करता है कि पी 6 और बाद के सीपीयू पर 16-, 32- और 64-बिट कैश लाइन के भीतर कैश मेमोरी तक पहुंच परमाणु है।