- एक या एक और आंतरिक (उचित प्रकार कास्टिंग के साथ) का उपयोग कर के बीच कोई अंतर है। क्या किसी विशिष्ट स्थिति में लंबे समय तक निष्पादन की तरह कोई छुपी लागत नहीं होगी?
हाँ, वहाँ प्रदर्शन के कारणों के एक अन्य बनाम चयन करने के लिए हो सकता है।
1: कभी-कभी एक अतिरिक्त चक्र या प्रतीक्षा अवधि (अग्रेषण देरी) अगर एक पूर्णांक निष्पादन इकाई के उत्पादन में एक एफपी निष्पादन इकाई, या इसके विपरीत के इनपुट के लिए रूट करने की आवश्यकता है के दो है। 128 बी डेटा को किसी भी संभावित गंतव्यों में स्थानांतरित करने के लिए बहुत सारे तार लेते हैं, इसलिए सीपीयू डिज़ाइनरों को ट्रेडऑफ करना पड़ता है, जैसे कि प्रत्येक एफपी आउटपुट से प्रत्येक एफपी इनपुट में प्रत्यक्ष पथ होने पर, सभी संभावित इनपुट नहीं।
this answer, या Agner Fog's microarchitecture doc बाईपास-देरी के लिए देखें। Agner के डॉक्टर में "नेहलेम पर डेटा बाईपास देरी" के लिए खोजें; इसमें कुछ अच्छे व्यावहारिक उदाहरण और चर्चा हैं। उनके पास विश्लेषण किए गए प्रत्येक सूक्ष्मजीव के लिए उनके पास एक अनुभाग है।
हालांकि, अलग डोमेन या रजिस्टर के विभिन्न प्रकार के बीच डेटा पारित करने के लिए देरी सैंडी ब्रिज और Nehalem पर से आइवी ब्रिज, और अक्सर शून्य पर छोटे होते हैं। - Agner कोहरा के माइक्रो मेहराब डॉक
कि विलंबता याद रखें कोई फर्क नहीं पड़ता अगर यह आपके कोड के महत्वपूर्ण मार्ग पर नहीं है।movaps + shufps
के बजाय pshufd
का उपयोग करना एक जीत हो सकता है यदि आपके महत्वपूर्ण पथ की विलंबता के बजाय यूओपी थ्रूपुट आपकी बाधा है।
2:...ps
संस्करण दूसरे दो की तुलना में कोड के 1 कम बाइट लेता है। यह निम्नलिखित निर्देशों को अलग-अलग संरेखित करेगा, जो डिकोडर्स और/या यूओपी कैश लाइनों के लिए महत्वपूर्ण हो सकता है।
3: हालिया इंटेल CPU केवल पोर्ट 5 पर एफपी संस्करण चला सकते हैं।
मेरॉम (Core2) और Penryn: orps
p0/p1/पी 5 पर चला सकते हैं, लेकिन केवल पूर्णांक-डोमेन। संभवतः सभी 3 संस्करण सटीक उसी यूओपी में डीकोड किए गए हैं। तो क्रॉस-डोमेन अग्रेषण देरी होती है। (एएमडी सीपीयू ऐसा भी कर: एफपी बिटवाइज़ निर्देश ivec डोमेन चलाते हैं।)
Nehalem/Sandybridge/IVB/Haswell/Broadwell: por
p0/p1/पी 5 पर चला सकते हैं, लेकिन orps
केवल port5 पर चला सकते हैं। पी 5 को शफल द्वारा भी जरूरी है, लेकिन एफएमए, एफपी एड, और एफपी मूल इकाइयां बंदरगाहों पर हैं 0/1।
स्किलेक: por
और orps
both have 3-per-cycle throughput। देरी अग्रेषण के बारे में जानकारी अभी तक उपलब्ध नहीं है।
ध्यान दें कि SNB/IVB (AVX नहीं बल्कि AVX2) पर, केवल पी 5, 256b तार्किक ऑप्स को संभालने के लिए के रूप में vpor ymm, ymm
AVX2 की आवश्यकता की जरूरत है। यह शायद बदलाव का कारण नहीं था, क्योंकि नेहलेम ने ऐसा किया था।
बुद्धिमानी कैसे चुनें: port5 पर तार्किक सेशन throughput एक टोंटी हो सकता है
है, तो, पूर्णांक संस्करणों का उपयोग भी एफपी डेटा पर। यह विशेष रूप से सच है यदि आप पूर्णांक शफल या अन्य डेटा-आंदोलन निर्देशों का उपयोग करना चाहते हैं।
एएमडी सीपीयू हमेशा लॉजिकल के लिए पूर्णांक डोमेन का उपयोग करते हैं, इसलिए यदि आपके पास एकाधिक पूर्णांक-डोमेन चीजें हैं, तो डोमेन के बीच राउंड-ट्रिप को कम करने के लिए उन्हें एक साथ करें। छोटी लेटेंसीज को रीडर बफर से चीजों को तेज़ी से साफ़ कर दिया जाएगा, भले ही एक डेप चेन आपके कोड के लिए बाधा न हो।
यदि आप एफपी एड और माल निर्देशों के बीच एफपी वैक्टर में थोड़ा सा सेट/साफ़/फ्लिप करना चाहते हैं, तो ...ps
लॉजिकल का उपयोग करें, यहां तक कि डबल-परिशुद्धता डेटा पर भी, क्योंकि सिंगल और डबल एफपी प्रत्येक सीपीयू पर एक ही डोमेन है अस्तित्व में, और ...ps
संस्करण एक बाइट कम हैं।
...pd
संस्करणों का उपयोग करने के लिए व्यावहारिक/मानव-कारक कारण हैं, हालांकि, अक्सर कोड के 1 बाइट से अधिक बचत होगी। अन्य मनुष्यों द्वारा अपने कोड की पठनीयता एक कारक है: वे आश्चर्य करेंगे क्यों तुम जब यह वास्तव में दोगुना हो जाता है है एकल के रूप में अपने डेटा का इलाज कर रहे हैं। Esp। सी/सी ++ इंट्रिनिक्स के साथ, __mm256
और __mm256d
के बीच आपके कोड को कूड़े हुए के लायक नहीं है। insn संरेखण मामलों के स्तर पर ट्यूनिंग, तो सीधे एएसएम में लिखते हैं, intrinsics नहीं! पूर्णांक डेटा के लिए (अनुदेश एक बाइट अब होने UOP कैश लाइन घनत्व और/या डिकोडर के लिए चीजों को बेहतर संरेखित सकता है।)
, पूर्णांक संस्करणों का उपयोग करें। सहेजा जा रहा है एक अनुदेश बाइट बाईपास-देरी के लायक नहीं है, और पूर्णांक कोड अक्सर पूरी तरह से शफ़ल के साथ व्यस्त port5 रहता है। Haswell के लिए, कई फेरबदल/सम्मिलित/निकालने/पैक/खोल दिए गए निर्देशों का P5 केवल, SNB/IVB के लिए p1/पी 5 के बजाय बन गया।
तीन अलग-अलग 86 निर्देश (
por
,
orps
,
orpd
) को
- ये intrinsics नक्शे। क्या किसी के पास कोई विचार है कि क्यों इंटेल कई निर्देशों के लिए बहुमूल्य ओपोड स्थान बर्बाद कर रहा है जो एक ही काम करता है?
आप इन निर्देश सेट के इतिहास को देखें, तो आप एक तरह से देख सकते हैं कि हम यहाँ मिल गया।
por (MMX): 0F EB /r
orps (SSE): 0F 56 /r
orpd (SSE2): 66 0F 56 /r
por (SSE2): 66 0F EB /r
MMX SSE से पहले से ही अस्तित्व में है, इसलिए इसे SSE के लिए opcodes की तरह (...ps
) निर्देश एक ही 0F xx
स्थान से बाहर चुने गए हैं लग रहा है। फिर एसएसई 2 के लिए, ...pd
संस्करण ने 66
...ps
ऑपोड पर ऑपरेंड-आकार उपसर्ग जोड़ा, और पूर्णांक संस्करण ने 66
एमएमएक्स संस्करण में उपसर्ग जोड़ा।
वे orpd
और/या por
छोड़ दिया है, लेकिन उन्होंने नहीं किया। शायद उन्होंने सोचा कि भविष्य के सीपीयू डिज़ाइनों में अलग-अलग डोमेन के बीच लंबे समय तक पथ हो सकते हैं, और इसलिए आपके डेटा के लिए मिलान निर्देश का उपयोग करना एक बड़ा सौदा होगा। भले ही अलग-अलग ऑपोडोड हों, एएमडी और शुरुआती इंटेल ने उन्हें वैक्टर के रूप में वही व्यवहार किया।
(पहले गलत जवाब होने के कारण हटा दिया गया जवाब - वीएमएक्स में भी इस्तेमाल होने के लिए मेरी गलती) – Crashworks