2009-11-14 10 views
26

मुझे यकीन नहीं है कि मुझे यह प्रश्न यहां पोस्ट करना चाहिए, क्योंकि यह एक प्रोग्रामिंग उन्मुख वेबसाइट प्रतीत होता है।यहां किसी ने भी इंटेल सी ++ कंपाइलर और जीसीसी का बेंचमार्क किया है?

वैसे भी, मुझे लगता है कि यहां कुछ गुरु होना चाहिए जो इसे जानते हैं।

अब मेरे पास एएमडी ओपर्टन सर्वर है जो CentOS 5 चला रहा है। मैं काफी बड़े C++ बूस्ट आधारित प्रोग्राम के लिए एक कंपाइलर रखना चाहता हूं। मुझे कौन सा कंपाइलर चुनना चाहिए?

+0

जब तक कंपाइलर/तेज स्विच के साथ चलता है और एक इंटेल सीपीयू पर चलता है (संकलक को इंटेल सीपीयू पर चलाना चाहिए, आवश्यक रूप से संकलित प्रोग्राम नहीं), आपको कुल मिलाकर एक अधिक कुशल कोड मिलता है। –

उत्तर

18

मुझे आशा है कि यह अधिक दर्द होता है की तुलना में :)

मैं एक कुछ समय से अधिक साल पहले एक छोटे से संकलक शूटआउट किया मदद करता है, और मैं स्मृति बंद जा रहा हूँ।

  1. जीसीसी 4.2 (Apple)
  2. इंटेल 10
  3. जीसीसी 4.2 (Apple) + LLVM

मैं कई टेम्पलेट भारी ऑडियो सिग्नल प्रोसेसिंग प्रोग्राम हैं जो मैं लिखा था परीक्षण किया गया।

संकलन के समय: इंटेल कंपाइलर अब तक का सबसे धीमा संकलक था - एक और पोस्ट उद्धृत के रूप में '2x गुना धीमा' से अधिक था।

जीसीसी ने इंटेल की तुलना में गहरे टेम्पलेट्स को बहुत अच्छी तरह से संभाला।

इंटेल कंपाइलर विशाल ऑब्जेक्ट फ़ाइलों को उत्पन्न करता है।

जीसीसी + एलएलवीएम ने सबसे छोटी बाइनरी पैदा की।

प्रोग्राम के निर्माण के कारण उत्पन्न कोड में महत्वपूर्ण भिन्नता हो सकती है, और जहां सिमड का उपयोग किया जा सकता है।

जिस तरह से मैंने लिखा, मुझे पता चला कि जीसीसी + एलएलवीएम ने सबसे अच्छा कोड बनाया है। उन कार्यक्रमों के लिए जो मैंने पहले लिखा था, मैंने अनुकूलन को गंभीरता से लिया (जैसा कि मैंने लिखा था), इंटेल आमतौर पर बेहतर था।

इंटेल के परिणाम अलग-अलग थे; इसने कुछ कार्यक्रमों को कहीं बेहतर तरीके से संभाला, और कुछ कार्यक्रम बहुत खराब हुए। इसने कच्चे प्रसंस्करण को बहुत अच्छी तरह से संभाला, लेकिन मैं केसीसी को एलसीसी + एलएलवीएम देता हूं क्योंकि जब बड़े (सामान्य) कार्यक्रम के संदर्भ में रखा जाता है ... यह बेहतर होता है।

इंटेल बॉक्स के बाहर जीत गया, विशाल डेटा सेट पर संख्या क्रंचिंग।

जीसीसी अकेले, धीमी कोड उत्पन्न यह माप और नैनो-अनुकूलन के साथ के रूप में तेजी से हो सकता है, हालांकि। मैं उन लोगों से बचना पसंद करता हूं क्योंकि हवा अगले कंपेलर रिलीज के साथ दिशा बदल सकती है, इसलिए बोलने के लिए।

मैं कभी नहीं इस परीक्षण में मापा जाता खराब लिखा कार्यक्रमों (अर्थात परिणाम बेहतर प्रदर्शन लोकप्रिय प्रदर्शन पुस्तकालयों का वितरण)।

अंत में, कार्यक्रमों कई वर्षों में लिखा गया था, उस समय में प्राथमिक संकलक के रूप में जीसीसी का उपयोग कर।

अद्यतन: मैं भी Core2Duo के लिए अनुकूलन/एक्सटेंशन सक्षम था। कार्यक्रम सख्त एलियासिंग सक्षम करने के लिए पर्याप्त साफ थे।

+0

क्या आप 'लिखने के तरीके' के बारे में बता सकते हैं? – int3

+3

@ int3 संक्षेप में, अनुकूलित प्रोग्राम के लिए, मैं लिखता हूं: अविश्वसनीय रूप से कड़ाई से/छोटा, प्रोग्राम का मूल्यांकन करने के लिए कंपाइलर को मजबूर करता है, विशेषज्ञता/ओवरलोड प्रदान करता है, संकलन समय पॉलीमोर्फिज्म (बनाम रनटाइम) प्राप्त करने के लिए मेरे रास्ते से बाहर निकलता है, बहुत कुछ प्रदान करता है कंपाइलर की दृश्यता, इरादे के रूप में कई भाषा विशेषताओं का उपयोग करें, स्थिरता, बल इनलाइनिंग, एक अविश्वसनीय रूप से लंबी चेतावनी सूची है। मैं माप और बेंचमार्क, कोई इनलाइन एएसएम।कंपाइलर शूटआउट के लिए विशिष्ट; मैं वेक्टरेशन/सिमड इन्स का लाभ लेने के लिए कार्यक्रमों को फिर से लिखने से पहले रोकता हूं, (एक क्षेत्र इंटेल का कंपाइलर उत्कृष्ट है)। मुझे आशा है कि वह मदद करेंगे। – justin

24

एक दिलचस्प PDF here है जो कई संकलकों की तुलना करता है।

+2

Psssstttttt .... मैं बस इसे पोस्ट करने वाला था। यह वास्तव में केवल माइक्रो ऑप्टिमाइज़ेशन पर चर्चा करता है, और ऐसा लगता है कि जीसीसी बेहतर है कि ज्यादातर मामलों में आईसीसी बेहतर है। – dmckee

+3

ऐय उस मोर्चे पर एक दिलचस्प दस्तावेज़ है। काश आप जीसीसी के लिए विजुअल अस्थिर एकीकरण प्राप्त कर सकते हैं। यह म्यूट के नट्स होगा ... – Goz

1

मैं एक बड़े समूह पर चलने वाली काफी बड़ी सिग्नल प्रोसेसिंग सिस्टम पर काम करता था। हम भारी गणित क्रंचिंग के लिए मानते थे, इंटेल कंपाइलर ने हमें जीसीसी की तुलना में लगभग 10% कम CPU लोड दिया था। यह बहुत अवैज्ञानिक है लेकिन यह हमारा अनुभव था (जो लगभग 18 महीने पहले था)।

क्या दिलचस्प होगा यदि हम इंटेल के गणित पुस्तकालयों का उपयोग करने में सक्षम होंगे, साथ ही साथ उनके चिपसेट का अधिक कुशलतापूर्वक उपयोग करें।

14

माईएसक्यूएल टीम ने एक बार पोस्ट किया कि आईसीसी ने उन्हें जीसीसी पर 10% प्रदर्शन बढ़ावा दिया। मैं लिंक खोजने की कोशिश करूंगा।

सामान्य तौर पर मैंने पाया कि 'स्थानीय' compilers उनके संबंधित प्लेटफार्मों पर जीसीसी तुलना में बेहतर प्रदर्शन

संपादित करें: मैं एक छोटे से बंद किया गया था। विशिष्ट लाभ 20-30% 10% नहीं थे। कुछ संकीर्ण किनारे के मामलों में प्रदर्शन की दोगुना हो गई। http://www.mysqlperformanceblog.com/files/presentations/LinuxWorld2004-Intel.pdf

5

हम अपने उत्पाद (डीबी 2) पर इंटेल संकलक उपयोग लिनक्स और विंडोज IA32/AMD64, पर और ओएस एक्स पर (अर्थात SunAMD को छोड़कर सभी हमारे इंटेल मंच बंदरगाहों)।

मैं संख्या पता नहीं है, लेकिन प्रदर्शन काफी अच्छा है कि हम: संकलक जो मुझे बताया गया हूँ के लिए

  • वेतन बहुत महंगा है।
  • 2x गुना धीमी बिल्डिंग समय के साथ रहता है (मुख्य रूप से जब वह इसे चलाने से पहले लाइसेंस प्राप्त करने में खर्च करता है)।
6

मैं इसे कोड पर निर्भर करता है लगता है, लेकिन codebase के साथ मैं अब काम कर रहा हूँ, आईसीसी 11.035 एक जिऑन पर जीसीसी 4.4.0 पर एक लगभग 2x सुधार देता 5504.

आईसीसी विकल्प: -O2 -fno-alias
जीसीसी विकल्प: -O3 -msse3 -mfpmath=sse -fargument-noalias-global

विकल्प केवल गणना-गहन कोड वाली फ़ाइल के लिए विशिष्ट हैं, जहां मुझे पता है कि कोई एलियासिंग नहीं है। 5-स्तरीय घोंसला वाले लूप वाले एकल-थ्रेडेड कोड।

हालांकि autovectorization सक्षम किया गया है, न तो compilers vectorized कोड उत्पन्न (नहीं compilers की एक गलती)


अद्यतन (2015/02/27): करने के लिए कुछ भूभौतिकी कोड के अनुकूलन जबकि (Q2, 2013) सैंडी ब्रिज-ई ज़ियोन पर चलते हुए, मुझे जीसीसी 4.8.0 के खिलाफ आईसीसी 11.1 के प्रदर्शन की तुलना करने का अवसर मिला, और जीसीसी अब आईसीसी की तुलना में तेज़ कोड उत्पन्न कर रहा था। कोड को एवीएक्स इंट्रिनिक्स का इस्तेमाल किया गया था और 8-वेक्टर वेक्टरिज्ड निर्देशों का उपयोग किया था (कुछ डेटा लेआउट आवश्यकताओं के कारण नीरस कंपाइलर कोड को ठीक से स्वत: संरक्षित किया गया था)।इसके अलावा, जीसीसी के एलटीओ कार्यान्वयन (आईओ कोर में एम्बेडेड आईआर कोर के साथ) आईसीसी में उससे प्रबंधित करना बहुत आसान था। एलटीओ के साथ जीसीसी एलटीओ के बिना आईसीसी की तुलना में लगभग 3 गुना तेजी से चल रहा था। मैं एलटीओ के बिना जीसीसी के लिए अभी नंबर नहीं ढूंढ पा रहा हूं, लेकिन मुझे याद है कि यह आईसीसी की तुलना में अभी भी तेज है। यह आईसीसी के प्रदर्शन पर कोई सामान्य बयान नहीं है, लेकिन परिणाम हमारे लिए जीसीसी 4.8 के साथ आगे बढ़ने के लिए पर्याप्त थे। *।

जीसीसी 5.0 (http://www.phoronix.com/scan.php?page=article&item=gcc-50-broadwell) के लिए तत्पर हैं!

+0

क्षमा करें, यह होना चाहिए -फैगमेंट-नोएलस-जीसीसी के लिए ग्लोबल, नहीं -फनो-उर्फ –

+1

इसे पोस्ट करने के लिए धन्यवाद। आपके लेख को पढ़ने के बाद, मैंने आपके जीसीसी विकल्पों को आजमाया। मैंने अपने कार्यक्रम को '-O3' के साथ सुधार के बिना कोशिश की थी, लेकिन' -O3 -msse3' ने मेरे कार्यक्रम पर * विशाल * सुधार किया! जो सामान मैं कर रहा हूं (ऑडियो डीएसपी) काफी वेक्टरिज़ेबल है, लेकिन मैंने अभी तक जेनरेट कोड को नहीं देखा है। लेकिन मेरा प्रोग्राम अपने टेस्ट सूट को पास करता है, और यह 2/3 के तहत करता है जब उसने पहले किया था! – steveha

+0

@steveha कूल! इसके अतिरिक्त, अगर आप जानते हैं कि कोड में कोई अलियासिंग नहीं है, तो प्रतिबंधित कीवर्ड का उपयोग करके अपने पॉइंटर्स को चुनिंदा रूप से प्रतिबंधित करें। यह संकलक निर्देशों में संकलक को और अधिक लचीलापन देता है। जब मैं टीआई डीएसपी –

2

पीएचपी - स्रोत से संकलन, बल्कि जीसीसी से आईसीसी के साथ, एक 10% से 20% की गति improvment में परिणाम चाहिए - http://www.papelipe.no/tags/ez_publish/benchmark_of_intel_compiled_icc_apache_php_and_apc

MySQL - स्रोत से संकलन, बल्कि जीसीसी से आईसीसी के साथ, चाहिए एक 25% से 50% की गति improvment में परिणाम - http://www.mysqlperformanceblog.com/files/presentations/LinuxWorld2005-Intel.pdf

1

मैं एक openSUSE 12.2 (कर्नेल 3.4.33-2.24-डिफ़ॉल्ट x86_64) पर UnixBench (v 5.1.3।) का इस्तेमाल किया है, और यह पहले संकलित जीसीसी के साथ, और फिर इंटेल के कंपाइलर के साथ।

1 समांतर प्रतिलिपि के साथ, इंटेल के साथ संकलित यूनिक्सबेन्च जीसीसी के साथ संकलित संस्करण की तुलना में लगभग 20% तेज है। हालांकि यह भारी अंतर छुपाता है। इंटेल कंपाइलर के साथ ध्रस्टोन लगभग 25% धीमी है, जबकि वेथस्टोन 2x तेज है।

समानांतर में चल रहे यूनिक्सबेन्च की 4 प्रतियों के साथ, जीसीसी पर इंटेल कंपाइलर में सुधार केवल 7% है। फिर इंटेल इंटेल वेथस्टोन (> 200%) में बहुत बेहतर है, और धीरस्टोन (लगभग 20%) में धीमा है।

0

इंटेल कंपाइलर द्वारा कई अनुकूलन नियमित रूप से विशिष्ट स्रोत वाक्यविन्यास और जीसीसी के लिए -O3 -ffast-math का उपयोग करने की आवश्यकता होती है। दुर्भाग्यवश, -फैस्ट-गणित-ओ 3-मार्च = मूल के -फनसाफ-गणित-अनुकूलन घटक -fopenmp के साथ असंगत साबित हुए हैं, इसलिए मुझे मेकफ़ाइल में विभिन्न विकल्पों के साथ नामित समूहों में अपनी स्रोत फ़ाइलों को विभाजित करना होगा। आज मैं एक विफलता में भाग गया जहां एक g ++ बिल्ड -O3 -ffast-math -fopenmp -march = देशी का उपयोग कर स्क्रीन पर लिखने में सक्षम था लेकिन फ़ाइल पर रीडायरेक्ट नहीं किया गया था। मेरी राय में अधिक गंभीर मतभेदों में से एक है आईसीपीसी द्वारा केवल std :: max और min का अनुकूलन जहां gcc/g ++ fmax | min [f] -ffast-math के साथ मानक से अपना अर्थ बदलने के लिए है।

संबंधित मुद्दे