यह संभवतः आपके एल 2 कैश में संघर्ष के साथ है।
मैटिस 1 पर कैश मिस नहीं होती क्योंकि वे क्रमिक रूप से एक्सेस किए जाते हैं। हालांकि matice2 के लिए अगर L2 में एक पूर्ण स्तंभ फिट बैठता है (यानी जब आप matice2 [0, 0], matice2 [1, 0], matice2 [2, 0] ... आदि का उपयोग करते हैं, तो कुछ भी निष्कासित नहीं होता) से कोई समस्या नहीं है या तो matice2 के साथ कैश की याद आती है।
अब गहराई में जाने के लिए कि कैश कैसे काम करता है, यदि आपके चर का बाइट पता X है, तो इसके लिए कैश लाइन की तुलना में (X >> 6) & (L - 1) होगा। जहां L आपके कैश में कुल कैश लाइनों की संख्या है। L हमेशा की शक्ति है। छह इस तथ्य से आता है कि 2 ^ 6 == 64 बाइट्स कैश लाइन का मानक आकार है।
अब इसका क्या मतलब है? वैसे इसका मतलब यह है कि अगर मेरा पता X है और पता Y और (X >> 6) - (Y >> 6) L से विभाज्य है (यानी 2 की कोई बड़ी शक्ति), तो उन्हें उसी कैशलाइन में संग्रहीत किया जाएगा।
अब अपनी समस्या पर वापस जाने के लिए 2048 और 2049 के बीच क्या अंतर है,
जब 2048 आपका आकार है:
अगर आप & matice2 [x, k] और matice2 [y, k] का अंतर लेते हैं (और matice2 [x, k] >> 6) - (और matice2 [y, k] >> >> 6) 2048 * 4 (आकार) से विभाज्य हो जाएगा की नाव)। तो 2 की एक बड़ी शक्ति।
इस प्रकार आपके L2 के आकार के आधार पर आपके पास बहुत सारी कैश लाइन की उलझनें होंगी, और कॉलम को स्टोर करने के लिए अपने L2 के छोटे हिस्से का उपयोग करें, इस प्रकार आप वास्तव में अपने कैश में पूर्ण कॉलम को स्टोर करने में सक्षम नहीं होंगे, इस प्रकार आपको खराब प्रदर्शन मिलेगा ।
जब आकार 2049 है, तो अंतर 2049 * 4 है जो 2 की शक्ति नहीं है, इस प्रकार आपके पास कम संघर्ष होंगे और आपका कॉलम सुरक्षित रूप से आपके कैश में फिट होगा।
अब इस सिद्धांत का परीक्षण करने के लिए कुछ चीजें हैं जो आप कर सकते हैं:
इस matice2 [razmor, 4096] की तरह अपनी सरणी matice2 सरणी आवंटित करें, और razmor = 1024, 1025 या किसी भी आकार के साथ चलाएं, और आपको पहले की तुलना में बहुत खराब प्रदर्शन देखना चाहिए। ऐसा इसलिए है क्योंकि आप सभी स्तंभों को एक दूसरे के साथ संघर्ष करने के लिए बलपूर्वक संरेखित करते हैं।
फिर matice2 [razmor, 4097] आज़माएं और इसे किसी भी आकार के साथ चलाएं और आपको बहुत बेहतर प्रदर्शन देखना चाहिए।