मुझे कुछ साधारण 32 बिट कोड मिला है जो 32 बिट पूर्णांक की सरणी के उत्पाद की गणना करता है। भीतरी पाश इस तरह दिखता है:राउंड-ट्रिप नहीं करने से स्मृति मेमोरी राउंड-ट्रिप क्यों तेज है?
@@loop:
mov esi,[ebx]
mov [esp],esi
imul eax,[esp]
add ebx, 4
dec edx
jnz @@loop
क्या मैं समझने की कोशिश कर रहा हूँ क्यों उपरोक्त कोड 6% कोड है, जो अनावश्यक स्मृति राउंड ट्रिप प्रदर्शन नहीं करता के ये दो संस्करण की तुलना में तेजी है:
@@loop:
mov esi,[ebx]
imul eax,esi
add ebx, 4
dec edx
jnz @@loop
और
@@loop:
imul eax,[ebx]
add ebx, 4
dec edx
jnz @@loop
कोड के दो बाद के टुकड़े लगभग एक ही समय में, निष्पादित और के रूप में उल्लेख दोनों 6% पहले टुकड़ा (165ms बनाम 155ms, 200 मिलियन तत्व) की तुलना में धीमी है।
मैंने कूद लक्ष्य को 16 बाइट सीमा पर मैन्युअल रूप से संरेखित करने का प्रयास किया है, लेकिन इससे कोई फर्क नहीं पड़ता।
मैं इसे इंटेल i7 4770k, विंडोज 10 x64 पर चला रहा हूं।
नोट: मुझे पता है कि सभी प्रकार के अनुकूलन करके कोड को बेहतर किया जा सकता है, हालांकि मुझे केवल कोड के उपरोक्त टुकड़ों के बीच प्रदर्शन अंतर में दिलचस्पी है।
मैं आपको संदर्भ नहीं दे सकता (क्योंकि वे संभवतः अस्तित्व में नहीं हैं, क्योंकि वे व्यापार रहस्य प्रकट करेंगे), लेकिन संभवतः आप असाधारण प्रयासों का एक आर्टिफैक्ट देख रहे हैं जो इंटेल एल 1 कैश प्रदर्शन में डालता है। – Gene
क्या यह तब भी होता है जब आप दूसरे संस्करण में एक डमी लोड 'mov ecx, [ebx] 'डालते हैं? – harold
कैश किए गए मामले में प्रदर्शन कैसा है? पहले लूप को प्रति 2 चक्रों में लूप बफर से बाहर होना चाहिए (क्योंकि यह आपके हैसवेल सीपीयू पर 5 फ़्यूज्ड-डोमेन यूपीएस है)। अन्य दो प्रति चक्र एक चक्र में जारी कर सकते हैं। हालांकि, लूप-ले जाने वाली 'imul' निर्भरता श्रृंखला उन्हें प्रति पुनरावृत्ति के लिए सभी 3 चक्रों तक सीमित करनी चाहिए।पहले में महत्वपूर्ण पथ निर्भरता श्रृंखला में स्टोर और पुनः लोड नहीं होता है, और हैसवेल हर चक्र में 2x लोड + 1x स्टोर निष्पादित कर सकता है। (प्री-हैसवेल में एक समर्पित स्टोर एजीई नहीं था)। मैं नहीं देख सकता कि यह तेज़ क्यों है, लेकिन यह समझ में आता है कि यह धीमा नहीं है। –