2013-06-30 10 views
5

मुझे ठीक-ट्यूनिंग कैश-सचेत डेटा संरचनाओं में दिलचस्पी है (उदाहरण के लिए Michael Spiegel's dissertation या हर्ली एट अल के hopscotch hashing में लॉक-फ्री स्किप पेड़) के साथ-साथ false sharing को रोकने में भी देखें। समवर्ती सरणी प्रसंस्करण के दौरान। मुझे पहले से ही पता है कि "sun.arch.data.model" संपत्ति के माध्यम से JVM पॉइंटर आकार को कैसे ढूंढें, लेकिन मैं L1 कैश में कैश लाइनों के आकार को निर्धारित करने का कोई तरीका नहीं ढूंढ पाया।जावा प्रक्रिया के भीतर से मुझे एल 1 कैश लाइनों का आकार कैसे मिल सकता है?

ध्यान दें कि यह जानकारी महत्वपूर्ण नहीं है, क्योंकि मैं केवल एल 1 लाइन आकार के लिए रूढ़िवादी अनुमानों का उपयोग करना जारी रख सकता हूं (64 बाइट्स जब ठीक-ट्यूनिंग कैश-सचेत डेटा संरचनाएं, या झूठी साझाकरण को रोकने के दौरान 256 बाइट्स); हालांकि अगर एल 1 कैश गुणों को हासिल करना आसान है तो मैं इसका उपयोग भी कर सकता हूं।

+0

मुझे लगता है कि यह (बहुत रोचक, मैं भी रोमांचक कहूंगा) कार्य को लागू करने के लिए बहुत अधिक लागत होगी। मैं यहां आलसी चीज करूंगा: सीपीयू मॉडल के लिए हार्डकोड कैश आकार, और यह निर्धारित करें - क्योंकि यह आसान हो सकता है। हालांकि, यह गलत हो सकता है यदि JVM किसी प्रकार के वीएम के अंदर चलाया जाता है जो वास्तविक CPU मॉडल को छुपाता है, जबकि आपका समाधान उस परिदृश्य के लिए सही आकार का उपयोग करेगा ... – ppeterka

+0

रेखा का आकार रेखा का आकार है; यह किस अर्थ में 64 ** और ** 256 है? –

+0

@OliCharlesworth यदि मुझे सटीक रेखा आकार नहीं पता है तो मैं जो कुछ हासिल करने की कोशिश कर रहा हूं उसके आधार पर अलग-अलग अनुमानों का उपयोग करता हूं, उदाहरण के लिए यदि मैं कैश-सचेत डेटा संरचना को ठीक-ठीक कर रहा हूं तो मैं 64 बाइट्स के निचले अनुमान का उपयोग करूंगा क्योंकि इस प्रकार डेटा संरचना अभी भी अच्छी तरह से प्रदर्शन करेगी यदि वास्तविक रेखा का आकार 64 बाइट्स से बड़ा है, और यदि मैं हूं झूठी साझाकरण को रोकने के बाद मैं 256 बाइट्स के उच्च अनुमान का उपयोग करूंगा क्योंकि वास्तविक लाइन आकार 256 बाइट से कम होने पर यह अभी भी अच्छा प्रदर्शन करेगा। –

उत्तर

1

मैंने जावा के लिए एक छोटी लाइब्रेरी प्रोग्राम की है जिसे CacheSize कहा जाता है जो वर्तमान में केवल इंटेल प्रोसेसर का समर्थन करता है। सेट/लाइन

  • associativy
  • की
  • संख्या ...
  • वेबसाइट here है

    • कैश लाइन आकार: आप कैश के विभिन्न स्तरों पर सभी जानकारी का उपयोग कर सकते हैं। मेवेन सेंट्रल के माध्यम से भी उपलब्ध है।

    0

    आप जो कर सकते हैं वह एक साधारण लूप है जो किसी दिए गए चरण में स्मृति से एकल बाइट पढ़ता है। यदि आपराइड 1 (बाइट) है, तो आपसे प्रत्येक बार पुनरावृत्ति के बाद एक लाइन लांच दंड का भुगतान करना होगा। यदि आप स्किप को दोगुना करते हैं, तो आप आधे प्रदर्शन की उम्मीद कर सकते हैं क्योंकि अब आप पुनरावृत्ति के समान संख्या में दो बार एक पंक्ति प्राप्त करते हैं।

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

    यह भी ध्यान रखें कि आपका कोड डेटा सेट (उदाहरण के लिए एक सरणी) पर चलाना चाहिए, जो कि अंतिम स्तर कैश से बड़ा है, कुछ एमबी पर्याप्त होना चाहिए।

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