2012-08-08 12 views
8

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

int a[256], b[256]; 

इस संभावित एक pessimization है क्योंकि कम पता बिट्स ही यह मुश्किल कैश दोनों सरणियों एक साथ संभाल करने के लिए कर सकते हैं किया जा रहा है? क्या निर्दिष्ट करना बेहतर होगा 256 के बजाय 300?

+4

आप संदेह करने के लिए सही हैं कि दोनों शक्तियां समस्याग्रस्त हो सकती हैं। लेकिन यह आमतौर पर तब लागू होता है जब आपके पास 2 से अधिक चरण होते हैं। (विशेष रूप से जब आप अपनी एल 1 कैश सहयोगीता को पार करते हैं) [यहां एक उदाहरण दिया गया है जहां यह वास्तव में समस्याग्रस्त हो जाता है।] (http://stackoverflow.com/questions/8547778/why-is-one-loop-so-much-llower-than -दो-लूप) उस उदाहरण में, 4 सरणी हैं - जिनमें से सभी एक 4k पृष्ठ की शुरुआत से उसी ऑफ़सेट पर गठबंधन होते हैं। – Mysticial

उत्तर

6

एक जवाब के लिए मेरी टिप्पणी बढ़ते:

आपको संदेह को अधिकार के- दो समस्याग्रस्त किया जा सकता है कि सही हैं। लेकिन यह आमतौर पर तब लागू होता है जब आपके पास 2 से अधिक चरण होते हैं। यह आपके L1 cache associativity से अधिक होने तक वास्तव में खराब नहीं होता है। लेकिन इससे पहले कि आप झूठी अलियासिंग मुद्दों में भाग ले सकते हैं।

यहां दो उदाहरण हैं जहां शक्तियों के- दो वास्तव में समस्या पैदा करने वाले बन जाते हैं:

पहले उदाहरण में, 4 सरणियों कर रहे हैं - जो सभी कर रहे हैं गठबंधन एक 4k पृष्ठ की शुरुआत से एक ही ऑफसेट के लिए।

दूसरे उदाहरण में, एक मैट्रिक्स के कॉलम-वार होपिंग पूरी तरह से प्रदर्शन को नष्ट कर देता है जब आकार एक शक्ति है।


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

+0

एक और उपयोगी चाल: यदि आप कभी भी एक समय में प्रविष्टियों तक पहुंचते हैं (और कभी भी "स्काइस" को memcpy या like के माध्यम से एक्सेस नहीं करते हैं) तो आप सरणी के इंडेक्स में एक छोटा सा हैश फ़ंक्शन लगाने का प्रयास कर सकते हैं। आमतौर पर, एक्सओआर। अर्थात। हमेशा एक [i^0x67] और बी [जे^0x34] तक पहुंचें। // मुझे बस एक जगह मिली जहां वह मदद करता है। –

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