Intel® संगीतकार XE 2015 बीटा: रिपोर्ट करना ठीक है!


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

तो, 2015 में, कम्पोज़र के बीटा संस्करण में C ++ और फोरट्रान कंपाइलर्स v.15.0 बीटा, मैथ कर्नेल लाइब्रेरी 11.2 बीटा, इंटीग्रेटेड परफॉरमेंस प्राइमिटिव्स 8.1 और थ्रेडिंग बिल्डिंग ब्लॉक्स 4.2 अपडेट 3 शामिल थे। हमेशा की तरह, सभी प्लेटफ़ॉर्म समर्थित हैं - विंडोज, लिनक्स और ओएस एक्स। ध्यान दें कि कोई संकलक नहीं है और संकलक संस्करण 14.1 नहीं होगा (पिछला संस्करण 14.0 है)।

बीटा संस्करण में फिर से एकीकृत ग्राफिक्स - इंटेल ग्राफिक्स टेक्नोलॉजी का उपयोग करके गणना करने का अवसर है। मैं इसे फिर से कहता हूं, क्योंकि यह कार्यक्षमता पहले से ही पिछले बीटा संस्करण में परीक्षण की गई थी, लेकिन आधिकारिक रिलीज में कभी नहीं दिखाई दी। चलो आशा करते हैं कि इस बार वह प्रकाश को देखेगा। अवसर दिलचस्प है और निश्चित रूप से, विशेष ध्यान और एक अलग वार्तालाप के योग्य है। इंटेल Xeon Phi के लिए समर्थन IPP में जोड़ा गया है - यहाँ कोई आश्चर्य नहीं। इसके अलावा, OS X पर नए "icl" और "icl ++" कंपाइलर्स क्लैंग / LLVM के साथ बेहतर संगतता के लिए दिखाई दिए हैं। दिलचस्प बात यह है कि C ++ कंपाइलर के लिए, -ansi-alias विकल्प अब डिफ़ॉल्ट रूप से सक्षम है, जो पहले नहीं था, और C ++ 11 मानक अब पूरी तरह से समर्थित है।

शायद सभी परिवर्तनों में से अधिकांश ने कंपाइलर की ऑप्टिमाइज़ेशन रिपोर्ट्स को प्रभावित किया, जैसे ऑप्ट-रिपोर्ट, वीसी-रिपोर्ट, ओपन-रिपोर्ट और पैर-रिपोर्ट। हम उनके बारे में अधिक विस्तार से बात करेंगे।

मुझे आपको याद दिलाना है कि वे सभी स्रोत कोड के साथ संकलक द्वारा किए गए अनुकूलन के बारे में अलग-अलग जानकारी देते हैं। वर्षों से, हमने इन रिपोर्टों को बेहतर बनाने के लिए अनुरोधों को सुना है - उन्हें अधिक पठनीय, सुविधाजनक और समझने योग्य बनाने के लिए। वेक्टराइजेशन पर रिपोर्ट के बारे में सबसे अधिक चिंतित है, जो छोरों के अनुकूलन के लिए महत्वपूर्ण है। आइए देखें कि दो कार्यों और छोरों के साथ एक सरल कोड के उदाहरण पर वास्तव में क्या बदल गया है:

void foo0(int n, int *a) { for (int i = 0; i < n; ++i) { if (n & 1) { a[i] = a[i+1]; } } } void foo1(int n, int *a) { // will not be vectorized due to data dependency. for (int i = 1; i < n; ++i) { if (n & 1) { a[i] = a[i-1]; } } } 

संकलक के पिछले संस्करण के साथ कोड को संकलित करके, मैं ईमानदारी से इसके आउटपुट में थोड़ा भ्रमित हो गया।

 >icl -Qopt-report -c test.cpp 

सबसे पहले, हमें कुछ प्रकार के आंतरिक, डीबगिंग और पूरी तरह से बेकार के समान जानकारी का एक पूरा सेट मिला:

 <;-1:-1;IPO ROUTINE ATTRIBUTES PROPAGATION;;0> ROUTINE ATTRIBUTE PROPAGATION TOTALS: RDECL: NSE(0->0), AR(0->0) ENTRY: SE(0->0), DSE(0->0), AR(0->0) <;-1:-1;IPO MODREF;;0> CI-MOD: TOTAL(2):OTHER(2) CI-REF: TOTAL(2):OTHER(2) <;-1:-1;IPO;;0> 

सहमत हूँ, संकलक के कोड के बिना समझने के लिए व्यावहारिक रूप से कुछ भी नहीं है, लेकिन हम आईपीओ अनुकूलन, एक तथ्य के बारे में बात कर रहे हैं। इसलिए, थोड़ा कम हम इनलाइनिंग और संबंधित रिपोर्ट के लिए कुछ मापदंडों के मूल्यों को देखते हैं:

 INLINING OPTION VALUES: -Qinline-factor: 100 -Qinline-min-size: 30 -Qinline-max-size: 230 -Qinline-max-total-size: 2000 -Qinline-max-per-routine: 10000 -Qinline-max-per-compile: 500000 < test.cpp;2:8;IPO INLINING;?foo0@@YAXHPEAH@Z;0> INLINING REPORT: (?foo0@@YAXHPEAH@Z) [1/2=50.0%] 

निम्नलिखित फू समारोह के लिए एक वेक्टरकरण रिपोर्ट है:

 HPO VECTORIZER REPORT (?foo0@@YAXHPEAH@Z) LOG OPENED ON Wed May 14 14:38:33 2014 < test.cpp;-1:-1;hpo_vectorization;?foo0@@YAXHPEAH@Z;0> HPO Vectorizer Report (?foo0@@YAXHPEAH@Z) test.cpp(3:5-3:5):VEC:?foo0@@YAXHPEAH@Z: vectorization support: unroll factor set to 2 LOOP WAS VECTORIZED loop was not vectorized: nonstandard loop is not a vectorization candidate HLO REPORT LOG OPENED ON Wed May 14 14:38:33 2014 

और HLO रिपोर्ट:

 <test.cpp;-1:-1;hlo;?foo0@@YAXHPEAH@Z;0> High Level Optimizer Report (?foo0@@YAXHPEAH@Z) Predicate unswitching Report: (Condition and loop line numbers) <test.cpp;3:4;hlo_opt_pred;?foo0@@YAXHPEAH@Z;0> Condition at line 4 hoisted from loop at line 3 

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

इसलिए, कलाई के एक गुच्छे के साथ, मैंने संकलक के नए संस्करण के साथ कंसोल को खोला और ऐसा ही करने की कोशिश की:

 >icl -Qopt-report -c test.cpp 

परिणाम ने मुझे कुछ हद तक आश्चर्यचकित किया। मुझे कंसोल में कुछ भी दिखाई नहीं दिया, क्योंकि अब संकलक फाइल को रिपोर्ट को एक्सटेंशन के साथ भेजने के लिए डिफॉल्ट करता है। प्रत्येक ऑब्जेक्ट के लिए .optrpt और यह कहता है:

 icl: remark #10398: optimization reports are generated in *.optrpt files in the output directory 

अप्रत्याशित रूप से, और आपको इसके लिए तैयार रहने की आवश्यकता है। हमारे मामले में, फ़ाइल test.optrpt दिखाई दिया। आप इस व्यवहार को बदल सकते हैं और STDERR में पिछले प्रदर्शन को रिटर्न-ऑफ-रिपोर्ट-फ़ाइल: stderr स्विच का उपयोग करके बदल सकते हैं।
खैर, आइए देखें कि इस फाइल में क्या है। तथ्य यह है कि फॉर्म में सभी अनावश्यक जानकारी <; - 1: -1; IPO MODREF ;; 0> और इतने पर तुरंत ध्यान आकर्षित किया गया था। रिपोर्ट अच्छी तरह से संरचित है और बहुत अधिक समझने योग्य है। यह पहले की तरह IPO अनुकूलन रिपोर्ट के साथ शुरू होता है, लेकिन अब यह स्पष्ट रूप से स्पष्ट हो गया है:

 Report from: Interprocedural optimizations [ipo] IPO OPTIMIZATION REPORT: INLINING OPTION VALUES: -Qinline-factor: 100 -Qinline-min-size: 30 -Qinline-max-size: 230 -Qinline-max-total-size: 2000 -Qinline-max-per-routine: 10000 -Qinline-max-per-compile: 500000 

सामान्य तौर पर, रिपोर्ट में बहुत सारे शब्द जोड़े गए थे कि कौन सी रिपोर्ट शुरू होती है, जिससे समझने में आसानी होती है। आइए बताते हैं ऐसे:
 Begin optimization report for: foo0 Report from: Interprocedural optimizations [ipo] INLINE REPORT: (foo0) [1] Report from: Loop nest, Vector & Auto-parallelization optimizations [loop, vec, par] … =========================================================================== Begin optimization report for: foo1 Report from: Interprocedural optimizations [ipo] INLINE REPORT: (foo1) [2] Report from: Loop nest, Vector & Auto-parallelization optimizations [loop, vec, par] … 

लेकिन सबसे अधिक मैं निम्नलिखित प्रकार के एक वेक्टर से जानकारी से प्रसन्न था:
 LOOP BEGIN at C:\Users\ivorobts\Desktop\opt-report\test.cpp(13,5) Predicate Optimized v1 remark #25426: Invariant Condition at line 14 hoisted out of this loop remark #15046: loop was not vectorized: existence of vector dependence remark #25443: unrolled with remainder by 2 remark #25014: Number of Array Refs Scalar Replaced In Loop: 2 LOOP END 

प्रत्येक चक्र के लिए, अब LOOP BEGIN ... LOOP END फ़ॉर्म के "बीकन" हैं, इसलिए उन्हें भेद करना आसान है। वैसे, ऑप्ट-रिपोर्ट विकल्प को vec-report7 के साथ बदलना, पहले यह केवल वैश्वीकरण द्वारा जानकारी प्राप्त करना संभव था, और सबसे बड़ा संभव विवरण के साथ।
संकलक के इस संस्करण के साथ, vec-report अभी भी समर्थित है, लेकिन यह जल्द ही "सदियों" चला जाएगा, जिसमें ऑप्ट-रिपोर्ट-चरण की सभी शक्तियों को स्थानांतरित कर दिया जाएगा: vec। हां, और रिपोर्ट के लिए निर्धारित अधिकतम स्तर अब 7 नहीं है, लेकिन 5. मुझे याद है कि संस्करण 14.0 में, सेटिंग 7 (अधिकतम) के लिए आउटपुट को पार्स करने और इसे सामान्य, पठनीय रूप में लाने के लिए एक विशेष स्क्रिप्ट के उपयोग की आवश्यकता होती है। अब यह बिना किसी स्क्रिप्ट के आयोजित किया गया था, और अधिकतम स्तर अब 5 है, जैसा कि स्कूल में है।

तो, प्रयास करें:

 icl -Qopt-report:vec5 -c test.cpp 

ओह ... वैसे भी, रिपोर्ट में हम आईपीओ के बारे में जानकारी की उपलब्धता देखते हैं। एक बग जो जल्द ही ठीक होने की संभावना है। लेकिन अच्छे पुराने vec-report ने आवश्यकतानुसार काम किया, और रिपोर्ट की फ़ाइल में एक वेक्टर-रिपोर्ट के अलावा कुछ भी नहीं था:

 >icl -Qvec-report5 -c test.cpp 

लेकिन प्रत्येक अनुकूलन के लिए अलग-अलग विकल्पों का उपयोग करके दूर मत जाओ - जल्द ही उन्हें पूरी तरह से बाहर निकाल दिया जाएगा।
स्तर 5 के साथ, हमें फू फ़ंक्शन में लूप के बारे में बहुत सारी जानकारी मिली:

 LOOP BEGIN at C:\Users\ivorobts\Desktop\opt-report\test.cpp(3,5) remark #15134: vectorization support: reference a has aligned access remark #15135: vectorization support: reference a has unaligned access remark #15127: vectorization support: unaligned access used inside loop body remark #15002: LOOP WAS VECTORIZED remark #36058: entire loop may be executed in remainder remark #36065: unmasked aligned unit stride stores: 1 remark #36066: unmasked unaligned unit stride loads: 1 remark #36091: --- begin vector loop cost summary --- remark #36092: scalar loop cost: 8 remark #36093: vector loop cost: 1.250 remark #36094: estimated potential speedup: 5.820 remark #36095: lightweight vector operations: 3 remark #36104: --- end vector loop cost summary --- LOOP END 

वैसे, अच्छी खबर है - जल्द ही विज़ुअल स्टूडियो को सीखना चाहिए कि इन रिपोर्टों को सुंदर और सुविधाजनक रूप में कैसे प्रदर्शित किया जाए, और पेन और खुली फाइलों के साथ जाने की कोई आवश्यकता नहीं है। वे इस तरह के अवसर को जोड़ने का वादा करते हैं, पहले से ही बीटा संस्करण के लिए प्रलेखन में वर्णित है (कुंजी Qopt-रिपोर्ट-स्वरूप: बनाम), अगले अद्यतन में। अच्छा, रुको। इस बीच, हर कोई 11 जुलाई तक चलने वाले बीटा प्रोग्राम में भाग लेकर कंपाइलर सहित इंटेल टूल्स की नई सुविधाओं की कोशिश कर सकता है। नई सुविधाओं पर आपकी प्रतिक्रिया हमारे लिए बहुत मूल्यवान है, इसलिए अग्रिम धन्यवाद और शुभकामनाएं!

Source: https://habr.com/ru/post/In222769/


All Articles