एग्नर फॉग के ऑप्टिमाइज़ेशन गाइड बहुत बढ़िया हैं। उसके पास सभी हाल ही के x86 सीपीयू डिज़ाइन (जहाँ तक इंटेल पेंटियम है) के माइक्रोआर्किटेक्चर पर गाइड टेबल, इंस्ट्रक्शन टाइमिंग के टेबल और डॉक्स हैं। Https://stackoverflow.com/tags/x86/info से जुड़े कुछ अन्य संसाधन भी देखें
बस मज़े के लिए, मैं कुछ सवालों के जवाब दूंगा (हाल के इंटेल सीपीयू से नंबर)। ऑप्स की पसंद कोड के अनुकूलन का प्रमुख कारक नहीं है (जब तक कि आप विभाजन से बच नहीं सकते।)
सीपीयू पर एक एकल गुणा एक जोड़ से धीमी है?
हाँ (जब तक कि यह 2 की शक्ति से न हो)। (3-4x विलंबता, इंटेल पर केवल प्रति घड़ी थ्रूपुट के साथ।) इससे बचने के लिए अपने रास्ते से बहुत दूर न जाएं, हालांकि, चूंकि यह 2 या 3 के रूप में तेज़ है।
वास्तव में बुनियादी गणित और नियंत्रण प्रवाह opcodes की गति विशेषताएं क्या हैं?
यदि आप वास्तव में जानना चाहते हैं तो Agner Fog के निर्देश सारणी और माइक्रोआर्किटेक्चर गाइड देखें । सशर्त कूद से सावधान रहें। बिना शर्त कूदता है (फ़ंक्शन कॉल की तरह) कुछ छोटे ओवरहेड होते हैं, लेकिन बहुत अधिक नहीं।
यदि दो ऑपकोड्स को निष्पादित करने के लिए समान संख्या में चक्र लेते हैं, तो दोनों को किसी भी प्रदर्शन लाभ / हानि के बिना विनिमेय रूप से इस्तेमाल किया जा सकता है?
नहीं, वे कुछ और के रूप में एक ही निष्पादन बंदरगाह के लिए प्रतिस्पर्धा कर सकते हैं, या वे नहीं हो सकता है। यह निर्भर करता है कि सीपीयू किन अन्य निर्भरता श्रृंखलाओं पर समानांतर में काम कर सकता है। (व्यवहार में, आमतौर पर कोई उपयोगी निर्णय नहीं किया जाता है। यह कभी-कभी सामने आता है कि आप वेक्टर शिफ्ट या वेक्टर फेरबदल का उपयोग कर सकते हैं, जो इंटेल सीपीयू पर अलग-अलग बंदरगाहों पर चलते हैं। लेकिन पूरे रजिस्टर के शिफ्ट-बाय-बाइट्स में) PSLLDQ
आदि) फेरबदल इकाई में चलता है।)
X86 CPU प्रदर्शन के बारे में आप जो भी अन्य तकनीकी जानकारी साझा कर सकते हैं वह काबिले तारीफ है
एग्नर फॉग के माइक्रोकार्ड डॉक्स में इंटेल और एएमडी सीपीयू की पाइपलाइनों के बारे में विस्तार से वर्णन किया गया है ताकि पता लगाया जा सके कि प्रति चक्र कितने चक्र में एक लूप लेना चाहिए, और क्या टोंटी थ्रूपन, एक निर्भरता श्रृंखला या एक निष्पादन पोर्ट के लिए विवाद है। StackOverflow पर मेरे कुछ जवाब देखें, जैसे यह एक या यह ।
इसके अलावा, http://www.realworldtech.com/haswell-cpu/ (और पहले के डिजाइनों के समान) मजेदार है अगर आपको सीपीयू डिजाइन पसंद है।
यहाँ आपकी सूची है, मेरे सबसे अच्छे अतिथि के आधार पर, एक हैसवेल सीपीयू के लिए छांटा गया है। यह वास्तव में कुछ के लिए चीजों के बारे में सोचने का एक उपयोगी तरीका नहीं है, लेकिन एक एशम लूप ट्यूनिंग है, हालांकि। कैश / शाखा-भविष्यवाणी प्रभाव आमतौर पर हावी होते हैं, इसलिए अच्छे पैटर्न के लिए अपना कोड लिखें। संख्या बहुत हाथ-लहरदार हैं, और उच्च विलंबता के लिए खाते की कोशिश करते हैं, भले ही थ्रूपुट एक मुद्दा नहीं है, या अधिक उफ पैदा करने के लिए जो समानांतर में होने वाली अन्य चीजों के लिए पाइप को रोकते हैं। Esp। कैश / ब्रांच नंबर बहुत ही बना हुआ है। लूप-आधारित निर्भरता के लिए विलंबता मायने रखती है, प्रत्येक पुनरावृत्ति स्वतंत्र होने पर थ्रूपुट मायने रखता है।
TL: DR इन संख्याओं के आधार पर बनाया जाता है जो मैं "विशिष्ट" उपयोग के मामले के लिए चित्रण कर रहा हूं, जहां तक विलंबता, निष्पादन-बंदरगाह अड़चनों और फ्रंट-एंड थ्रूपुट (या शाखा शाखा जैसी चीजों के स्टाल) के बीच ट्रेडऑफ़ है। )। कृपया किसी भी तरह के गंभीर पूर्ण विश्लेषण के लिए इन नंबरों का उपयोग न करें ।
- 0.5 से 1 बिटवाइज / इंटीजर एडिक्शन / सबट्रेक्शन /
शिफ्ट और रोटेट (कम्पाइल-टाइम कास्ट काउंट) /
इन सभी के वेक्टर वर्जन (1 से 4 प्रति चक्र थ्रूपुट, 1 साइकल लेटेंसी)
- 1 वेक्टर मिनट, अधिकतम, तुलना-बराबर, तुलना-अधिक (मुखौटा बनाने के लिए)
- 1.5 वेक्टर फेरबदल। हैसवेल और नए में केवल एक फेरबदल पोर्ट होता है, और मुझे लगता है कि यदि आपको कोई आवश्यकता हो तो बहुत अधिक फेरबदल करना आम बात है, इसलिए कम फेरबदल का उपयोग करने के बारे में सोच को प्रोत्साहित करने के लिए मैं इसे थोड़ा अधिक बढ़ा रहा हूं। वे स्वतंत्र नहीं हैं, esp। यदि आपको मेमोरी से pshufb कंट्रोल मास्क की आवश्यकता है।
- 1.5 लोड / स्टोर (L1 कैश हिट। विलंबता विलंबता से बेहतर)
- 1.75 पूर्णांक गुणा (3c विलंबता / इंटेल पर 1c tput प्रति एक, AMD पर 4c lat और केवल 2c tput में से एक)। छोटे स्थिरांक LEA और / या ADD / SUB / पारी का उपयोग करके भी सस्ते हैं । लेकिन निश्चित रूप से संकलन-समय की स्थिरांक हमेशा अच्छे होते हैं , और अक्सर अन्य चीजों में अनुकूलन कर सकते हैं। (और एक लूप में गुणा करें अक्सर कंपाइलर द्वारा
tmp += 7
लूप के बजाय ताकत को कम किया जा सकता हैtmp = i*7
)
- 1.75 कुछ 256 बी वेक्टर शफल (इंस पर अतिरिक्त विलंबता जो एवीएक्स वेक्टर के 128 बी लेन के बीच डेटा को स्थानांतरित कर सकता है)। (या राइजेन पर 3 से 7 जहां लेन पार करने वाले फेरबदल के लिए कई और उफ की जरूरत होती है)
- 2 fp ऐड / सब (और उसी के वेक्टर संस्करण) (1 या 2 प्रति चक्र थ्रूपुट, 3 से 5 चक्र विलंबता)। धीमी गति से हो सकता है यदि आप विलंबता पर अड़चन डालते हैं, उदाहरण के लिए केवल 1
sum
चर के साथ एक सरणी को जोड़ दें। (मैं इस वजन कर सकते हैं और fp mul 1 से कम या उपयोग-केस के आधार पर 5 के रूप में उच्च)।
- 2 वेक्टर एफपी मॉल या एफएमए। (x * y + z, mul या ऐड के समान सस्ता है यदि आप FMA सपोर्ट सक्षम हैं)।
- 2 वेक्टर तत्वों में सामान्य-उद्देश्य रजिस्टर सम्मिलित करना / निकालना
_mm_insert_epi8
, आदि)
- 2.25 वेक्टर इंट मुल (16-बिट एलिमेंट्स या pmaddubsw कर रहे हैं 8 * 8 -> 16-बिट)। स्केलर की तुलना में बेहतर थ्रूपुट के साथ, स्काईलेक पर सस्ता
- 2.25 बदलाव / परिवर्तनशील गणना (2c विलंबता, इंटेल पर प्रति 2c थ्रूपुट, AMD पर तेजी से या BMI2 के साथ)
- २.५ बिना शाखा के तुलना (
y = x ? a : b
, या y = x >= 0
) ( test / setcc
या cmov
)
- 3 इंट-> फ्लोट रूपांतरण
- 3 पूरी तरह से नियंत्रण प्रवाह (अनुमानित शाखा, कॉल, रिटर्न) की भविष्यवाणी की।
- 4 वेक्टर इंट मुल (32-बिट एलिमेंट्स) (2 उफ, हसवेल पर 10 सी विलंबता)
- 4 पूर्णांक विभाजन या
%
एक संकलन-समय स्थिरांक (2 की गैर-शक्ति) द्वारा।
- 7 वेक्टर क्षैतिज ऑप्स (जैसे
PHADD
वेक्टर के भीतर मान जोड़ना)
- 11 (वेक्टर) एफपी डिवीजन (10-13 सी विलंबता, प्रति 7c थ्रूपुट या बदतर)। (अगर शायद ही कभी इस्तेमाल किया जा सकता है, लेकिन सस्ते हो सकता है, लेकिन एफपी म्यू से थ्रूपुट 6 से 40x खराब है)
- 13? नियंत्रण प्रवाह (खराब-पूर्वानुमानित शाखा, शायद 75% अनुमानित)
- 13 इंट डिवीजन ( हाँ वास्तव में , यह एफपी डिवीजन की तुलना में धीमा है, और वेक्टर नहीं कर सकता है)। (ध्यान दें कि कम्पाइलर एक स्थूल / शिफ्ट का उपयोग करके एक स्थिर से विभाजित होते हैं / एक जादू स्थिरांक के साथ जोड़ते हैं , और 2 की शक्तियों द्वारा div / mod बहुत सस्ते होते हैं।)
- 16 (वेक्टर) एफपी वर्गर्ट
- 25? लोड (L3 कैश हिट)। (कैश-मिस स्टोर लोड से सस्ते हैं।)
- 50? FP ट्रिगर / ऍक्स्प / लॉग। यदि आपको बहुत अधिक ऍक्स्प / लॉग की आवश्यकता है और पूर्ण सटीकता की आवश्यकता नहीं है, तो आप एक छोटी बहुपद और / या एक तालिका के साथ गति के लिए सटीकता का व्यापार कर सकते हैं। आप SIMD वेक्टराइज़ भी कर सकते हैं।
- 50-80? हमेशा -mispredenced शाखा, 15-20 चक्र की लागत
- 200-400? लोड / स्टोर (कैश मिस)
- 3000 ??? फ़ाइल से पृष्ठ पढ़ें (OS डिस्क कैश हिट) (यहां नंबर बना रहे हैं)
- 20000 ??? डिस्क रीड पेज (ओएस डिस्क-कैश मिस, फास्ट एसएसडी) (पूरी तरह से बनाया गया नंबर)
मैंने इसे पूरी तरह से अनुमान के आधार पर बनाया है । अगर कुछ गलत लगता है, तो यह इसलिए है क्योंकि मैं एक अलग उपयोग-केस, या एक संपादन त्रुटि के बारे में सोच रहा था।
एएमडी सीपीयू पर चीजों की सापेक्ष लागत समान होगी, सिवाय इसके कि शिफ्ट-काउंट परिवर्तनशील होने पर उनके पास तेजी से पूर्णांक शिफ्टर्स होते हैं। एएमडी बुलडोजर-परिवार सीपीयू विभिन्न कारणों से, अधिकांश कोड पर निश्चित रूप से धीमे हैं। (बहुत सारे सामान में रायज़ेन बहुत अच्छा है)।
ध्यान रखें कि चीजों को एक-आयामी लागत के नीचे उबालना वास्तव में असंभव है । कैश-मिस और ब्रांच मिसप्रिंट के अलावा, कोड के एक ब्लॉक में अड़चन विलंबता, कुल यूओपी थ्रूपुट (फ्रंटेंड), या एक विशिष्ट पोर्ट (निष्पादन पोर्ट) के थ्रूपुट हो सकता है।
यदि एफपी डिवीजन जैसा "धीमा" ऑपरेशन बहुत सस्ता हो सकता है अगर आसपास का कोड सीपीयू को अन्य काम में व्यस्त रखता है । (वेक्टर FP div या sqrt प्रत्येक 1 यूओपी हैं, उनके पास केवल खराब विलंबता और थ्रूपुट है। वे केवल डिवाइड यूनिट को ब्लॉक करते हैं, न कि पूरे निष्पादन पोर्ट को जो कि ऑन है। इंटीगर डिव कई यूओपी हैं।) इसलिए यदि आपके पास केवल एक एफपी डिवाइड है। प्रत्येक ~ 20 mul और जोड़ने के लिए, और वहाँ सीपीयू के लिए अन्य काम करना है (उदाहरण के लिए एक स्वतंत्र लूप पुनरावृत्ति), फिर FP div की "लागत" एक FP mul के समान हो सकती है। यह संभवतः कुछ सबसे अच्छा उदाहरण है जो कम थ्रूपुट है जब यह सब आप कर रहे हैं, लेकिन अन्य कोड के साथ बहुत अच्छी तरह से मिश्रण करता है (जब विलंबता कोई कारक नहीं है), कम कुल उफ़ की वजह से।
ध्यान दें कि पूर्णांक विभाजन लगभग आसपास के कोड के अनुकूल नहीं है: हसवेल पर, यह 9 यूओपी है, जिसमें प्रति 8-11c थ्रूपुट और 22-29c विलंबता है। (64 बिट डिवीजन ज्यादा धीमी है, यहां तक कि स्काईलेक पर भी।) इसलिए लेटेंसी और थ्रूपुट संख्या एफपी डिव के समान है, लेकिन एफपी डिव केवल एक यूओपी है।
थ्रूपुट, विलंबता और कुल उफ़ के लिए शिलालेखों के संक्षिप्त अनुक्रम का विश्लेषण करने के उदाहरणों के लिए, मेरे कुछ SO उत्तर देखें:
आईडीके अगर अन्य लोग इस तरह के विश्लेषण सहित एसओ उत्तर लिखते हैं। मेरे पास अपना खुद का ढूंढने का बहुत आसान समय है, क्योंकि मुझे पता है कि मैं अक्सर इस विस्तार में जाता हूं, और मुझे याद है कि मैंने क्या लिखा है।