सी कोड लूप प्रदर्शन [जारी]


83

यह सवाल मेरे यहाँ (रहस्य की सलाह पर) जारी है:

C कोड लूप प्रदर्शन


अपने प्रश्न पर जारी रखते हुए, जब मैं स्केलर के बजाय पैक्ड निर्देशों का उपयोग करता हूं, तो आंतरिक निर्देशों का उपयोग करके कोड बहुत समान दिखाई देगा:

for(int i=0; i<size; i+=16) {
    y1 = _mm_load_ps(output[i]);
    …
    y4 = _mm_load_ps(output[i+12]);

    for(k=0; k<ksize; k++){
        for(l=0; l<ksize; l++){
            w  = _mm_set_ps1(weight[i+k+l]);

            x1 = _mm_load_ps(input[i+k+l]);
            y1 = _mm_add_ps(y1,_mm_mul_ps(w,x1));
            …
            x4 = _mm_load_ps(input[i+k+l+12]);
            y4 = _mm_add_ps(y4,_mm_mul_ps(w,x4));
        }
    }
    _mm_store_ps(&output[i],y1);
    …
    _mm_store_ps(&output[i+12],y4);
    }

इस कर्नेल का मापा प्रदर्शन लगभग 5.6 एफपी संचालन प्रति चक्र है, हालांकि मुझे उम्मीद है कि यह स्केलर संस्करण के प्रदर्शन के 4x के बराबर होगा, अर्थात प्रति चक्र 4.1,6 = 6,4 एफपी ऑप्स।

वजन कारक के कदम को ध्यान में रखते हुए (यह इंगित करने के लिए धन्यवाद), अनुसूची इस प्रकार है:

अनुसूची

ऐसा लगता है कि शेड्यूल नहीं बदलता है, हालांकि movssऑपरेशन के बाद एक अतिरिक्त निर्देश है जो स्केलर के मान को एक्सएमएम रजिस्टर में ले जाता है और फिर shufpsपूरे वेक्टर में इस स्केलर मान को कॉपी करने के लिए उपयोग करता है। ऐसा लगता है कि वजन वेक्टर mulpsस्विचिंग विलंबता को लोड करने से लेकर फ्लोटिंग पॉइंट डोमेन तक खाते में समय पर उपयोग करने के लिए तैयार है , इसलिए यह किसी भी अतिरिक्त विलंबता को नहीं लेना चाहिए।

movaps(गठबंधन, पैक चाल), addpsऔर mulpsइसलिए यह किसी भी अतिरिक्त विलंबता या तो नहीं उठाना चाहिए निर्देश है कि इस कर्नेल में उपयोग किया जाता है (विधानसभा कोड के साथ की जाँच), एक ही विलंबता और उनके अदिश संस्करणों के रूप में प्रवाह क्षमता है।

क्या किसी को इस बात का अंदाजा है कि यह 8 चक्र प्रति अतिरिक्त चक्र कहां खर्च किया जाता है, यह मानकर कि यह कर्नेल अधिकतम प्रदर्शन प्राप्त कर सकता है 6.4 एफपी ऑप्स प्रति चक्र है और यह 5.6 एफपी ऑप्स प्रति चक्र पर चल रहा है?


वैसे यहाँ वास्तविक सभा कैसी दिखती है:

…
Block x: 
  movapsx  (%rax,%rcx,4), %xmm0
  movapsx  0x10(%rax,%rcx,4), %xmm1
  movapsx  0x20(%rax,%rcx,4), %xmm2
  movapsx  0x30(%rax,%rcx,4), %xmm3
  movssl  (%rdx,%rcx,4), %xmm4
  inc %rcx
  shufps $0x0, %xmm4, %xmm4               {fill weight vector}
  cmp $0x32, %rcx 
  mulps %xmm4, %xmm0 
  mulps %xmm4, %xmm1
  mulps %xmm4, %xmm2 
  mulps %xmm3, %xmm4
  addps %xmm0, %xmm5 
  addps %xmm1, %xmm6 
  addps %xmm2, %xmm7 
  addps %xmm4, %xmm8 
  jl 0x401ad6 <Block x> 
…

इसलिए मुझे लगता है कि अब सवाल यह है कि: " shufpsअनुदेश हर 1.6 पुनरावृत्तियों में 1 चक्र क्यों जोड़ता है?" यह एक कठिन है ...
रहस्यवादी

मुझे उम्मीद है कि इसका कोई उपरिव्यय नहीं होगा क्योंकि इसका उत्पादन shufpsसीधे multpsऑप को उपलब्ध होना चाहिए क्योंकि यह दोनों FP डोमेन है
रिकी

यह पता लगाना आसान है। सुनिश्चित करें कि वेट वेक्टर में किसी भी मूल्य वाले मान शामिल नहीं हैं। फेरबदल निर्देश के बिना लूप की कोशिश करें। यह किसी भी उपयोगी परिणाम का उत्पादन नहीं करेगा, लेकिन हो सकता है कि आपका पता आपको किस निर्देश पर अतिरिक्त चक्र खर्च करता है (मुझे संदेह है, निश्चित रूप से)।
गनथर पाईज़

@ मूल: मैं प्रति लूप पुनरावृत्ति जोड़ा 0.75 चक्र देखते हैं। (क्या यह 4 के बजाय 5 चक्रों का उपयोग करने के बारे में मेरी टिप्पणी नहीं थी, जो आपको अपने उत्तर में ले जाती है ... :-))
गनथर पाईज़

3
एक के लिए, अब आप 4x कैश बैंडविड्थ की मांग कर रहे हैं। डेटा आकार कितने बड़े हैं? क्या वे L1 कैश में फिट होते हैं?
मिस्टिकल

जवाबों:


3

Vtune में EMON प्रोफाइलिंग का उपयोग करने का प्रयास करें, या कुछ समान उपकरण जैसे oprof

EMON (इवेंट मॉनीटरिंग) प्रोफाइलिंग => समय आधारित उपकरण की तरह, लेकिन यह आपको बता सकता है कि प्रदर्शन की घटना क्या समस्या पैदा कर रही है। हालाँकि, आपको पहले समय आधारित प्रोफ़ाइल के साथ शुरू करना चाहिए, यह देखने के लिए कि क्या कोई विशेष निर्देश है जो कूदता है। (और संभवतः संबंधित घटनाएं जो आपको बताती हैं कि उस आईपी पर कितनी बार एक सेवानिवृत्ति स्टाल था।)

EMON प्रोफाइलिंग का उपयोग करने के लिए, आपको "सामान्य संदिग्धों" से लेकर ...

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

यह भी संभव हो सकता है कि यह एक सामने का छोर, अनुदेश लाने वाला, स्टाल हो। इन निर्देशों में वैसे भी कितने बाइट हैं? इसके लिए EMON ईवेंट भी हैं।


टिप्पणी करने के लिए प्रतिक्रिया व्यक्त करते हुए कि नेहलेम वीट्यून एल 3 घटनाओं को नहीं देख सकता है: यह सच नहीं है। यहाँ वह सामग्री है जो मैं टिप्पणी करने के लिए जोड़ रहा था, लेकिन फिट नहीं था:

दरअसल, LL3 / L3 $ / तथाकथित Uncore के लिए प्रदर्शन काउंटर हैं। अगर वीट्यून उनका समर्थन नहीं करता तो मुझे बहुत आश्चर्य होगा। Http://software.intel.com/sites/products/collateral/hpc/vtune/performance_analysis_guide.pdf देखेंवीटीयूएन और अन्य उपकरण जैसे कि पीटीयू। वास्तव में, यहां तक ​​कि एलएल 3 घटनाओं के बिना, जैसा कि डेविड लेविंथल कहते हैं: "इंटेल® कोर ™ आई 7 प्रोसेसर में एक" विलंबता घटना "है जो इटेनियम® प्रोसेसर फैमिली डेटा ईएआर इवेंट के समान है। इस घटना के नमूने लोड होते हैं, जो रिकॉर्डिंग की संख्या को दर्ज करता है। निर्देश के निष्पादन और डेटा के वास्तविक वितरण के बीच चक्र। यदि मापा विलंबता MSR 0x3f6, बिट्स 15: 0 में क्रमादेशित न्यूनतम विलंबता से बड़ा है, तो काउंटर बढ़ जाता है। काउंटर ओवरफ्लो PEBS तंत्र और अगले पर हथियार रखता है। घटना विलंबता सीमा को संतुष्ट करती है, मापा विलंबता, आभासी या रैखिक पता और डेटा स्रोत PEBS बफर में 3 अतिरिक्त रजिस्टरों में कॉपी किए जाते हैं। क्योंकि वर्चुअल पता एक ज्ञात स्थान में कैप्चर किया जाता है। नमूना चालक भी भौतिक अनुवाद के लिए आभासी का निष्पादन कर सकता है और भौतिक पते पर कब्जा कर सकता है। भौतिक पता NUMA होम स्थान की पहचान करता है और सिद्धांत रूप में कैश ऑक्यूपेंसी के विवरण का विश्लेषण करने की अनुमति देता है। "वह L3 CACHE_HIT_UNCORE_HIT और L3 CACHE_MISS_REMOTE_DRAM जैसी वीटीएन घटनाओं के लिए 35 पृष्ठ पर भी इंगित करता है। कभी-कभी आपको न्यूमेरिक देखने की आवश्यकता होती है। कोड और उन्हें VTune के निचले स्तर के इंटरफ़ेस में प्रोग्राम करते हैं, लेकिन मुझे लगता है कि इस मामले में यह सुंदर उपयोगकर्ता इंटरफ़ेस में दिखाई देता है।


ठीक है, http://software.intel.com/en-us/forums/showthread.php?t=77700&o=d&s=lr रूस में एक VTune प्रोग्रामर (मुझे लगता है) "बताते हैं" कि आप Uncore के लिए नमूना नहीं बना सकते हैं। आयोजन।

वह गलत है - आप उदाहरण के लिए, केवल एक सीपीयू सक्षम कर सकते हैं, और नमूना सार्थक रूप से। मेरा यह भी मानना ​​है कि सीपीयू में लौटते ही L3 लापता डेटा को चिह्नित करने की क्षमता है। वास्तव में, कुल मिलाकर L3 को पता है कि यह कौन सा CPU डेटा लौटा रहा है, इसलिए आप निश्चित रूप से नमूना ले सकते हैं। आप नहीं जान सकते कि कौन सा हाइपरथ्रेड है, लेकिन फिर से आप अक्षम कर सकते हैं, सिंगल थ्रेड मोड में जा सकते हैं।

लेकिन ऐसा लगता है, जैसा कि सामान्य है, आपको ऐसा करने के लिए AROUND VTune के साथ काम करना होगा, इसके साथ नहीं।

पहले विलंबता रूपरेखा का प्रयास करें। यह पूरी तरह से सीपीयू के अंदर है, और VTune लोगों ने इसे बहुत अधिक गड़बड़ करने की संभावना नहीं है।

और, मैं फिर से कहता हूं, संभावना यह है कि आपकी समस्या कोर में है, एल 3 में नहीं। इसलिए वीट्यून को उसको संभालने में सक्षम होना चाहिए।


लेविंथल प्रति "साइकिल लेखा" का प्रयास करें।


आपकी प्रतिक्रिया के लिए धन्यवाद। मैं अपने आवेदन का विश्लेषण करने के लिए वीट्यून का उपयोग करता हूं, लेकिन नेहलम वास्तुकला के साथ समस्या यह है कि एल 3 कैश off-coreकोर के हिस्से से संबंधित है , इसलिए इस भाग के लिए कोई प्रदर्शन ईवेंट काउंटर उपलब्ध नहीं हैं। इसलिए कैश वगैरह का अनुमान लगाना कठिन है।
रिकी

दरअसल, LL3 / L3 $ / तथाकथित Uncore के लिए प्रदर्शन काउंटर हैं। अगर वीट्यून उनका समर्थन नहीं करता तो मुझे बहुत आश्चर्य होगा। सॉफ्टवेयर
।intel.com/sites

मैंने टिप्पणी में फिट होने से अधिक लिखा, इसे उत्तर में स्थानांतरित करने और मूल टिप्पणी को साफ करने की कोशिश की, लेकिन टिप्पणियां केवल 5 मिनट के लिए संपादित की जा सकती हैं। लघु संस्करण: VTune आपको L3 कैश मिस देखने की अनुमति देता है। Uncore सपोर्ट के बिना भी, लेटेंसी प्रोफाइलिंग का उपयोग करते हुए - और इसमें Uncore सपोर्ट है।
क्रेजी गेलव

और कुल मिलाकर मुझे संदेह है कि आपकी समस्या L3 कैश मिस नहीं है। अधिक संभावना एक फ्रंट एंड इवेंट है।
क्रेजी गेलव

@KrazyGlew: आपका अनुमान सही है, वह रूसी संघ का एक रूसी लड़का है। यहाँ लिंक्डइन पर उसका प्रोफाइल है - लिंक्डइन.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.