2008-12-01 17 views
11

मुझे लगता है कि इस सवाल का जवाब देने के लिए पूरी तरह से असंभव है, लेकिन मैं केवल बॉलपार्क आंकड़े के बाद कर रहा हूँ:प्रति सी-निर्देश कितने एएसएम-निर्देश?

, एक यथोचित आकार सी कार्यक्रम (कोड की लाइनों के हजारों) को देखते हुए पर औसत, कितने एएसएम-निर्देश होगा उत्पन्न हो जाओ। दूसरे शब्दों में, यथार्थवादी सी-टू-एएसएम निर्देश अनुपात क्या है? धारणाएं बनाने के लिए स्वतंत्र महसूस करें, जैसे 'वर्तमान x86 आर्किटेक्चर के साथ'।

मैंने इस बारे में Google की कोशिश की, लेकिन मुझे कुछ भी नहीं मिला।

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

मैं एक सटीक और वैज्ञानिक उत्तर के बाद नहीं हूं, बल्कि एक अनुभवजन्य उत्तर है जिसे फाथोमेबल स्केल में रखा जा सकता है।

यह जगह का एक छोटा सा जवाब नहीं है (जैसा कि मुझे नोटिस किया गया था), और यह मेरा सबसे अच्छा प्रयास था। मुझे पता है कि सी की प्रति पंक्ति एएसएम की परिणामी रेखाओं की मात्रा आप जो कर रहे हैं उसके आधार पर भिन्न होती है। i++sqrt(23.1) के समान पड़ोस में नहीं है - मुझे यह पता है। इसके अतिरिक्त, कोई फर्क नहीं पड़ता कि एएसएम मैं सी से बाहर निकलता हूं, एएसएम को प्रोसेसर के भीतर माइक्रोक्रोड के विभिन्न सेटों में व्याख्या किया जाता है, जो कि फिर से निर्भर करता है कि आप एएमडी, इंटेल या कुछ और, और उनकी संबंधित पीढ़ी चला रहे हैं या नहीं। मुझे इसके बारे में भी पता है।

मैं अब तक जो गेंदबाजी जवाब प्राप्त कर चुका हूं वह है: एएनएसआई-सी की 1 लाइन प्रति x86 एएसएम की लगभग 2 लाइनों पर एक परियोजना काफी बड़ी औसत है। एक बार पाइपलाइन भरने के बाद, आज के प्रोसेसर शायद प्रति घड़ी चक्र के बारे में एक एएसएम कमांड पर औसत होंगे, और एक नमूना काफी बड़ा दिया जाएगा।

+0

आप इस निर्णय के जवाब पर कौन सा निर्णय लेते हैं? – EvilTeach

उत्तर

10

मुझे यकीन है कि आप "सी-अनुदेश", शायद बयान क्या मतलब है नहीं कर रहा हूँ या रेखा? बेशक यह कई कारकों के कारण काफी भिन्न होगा लेकिन मेरे कुछ नमूना कार्यक्रमों को देखने के बाद, उनमें से कई 2-1 अंक (प्रति एलओसी 2 असेंबली निर्देश) के करीब हैं, मुझे नहीं पता कि यह क्या है मतलब है या यह कैसे उपयोगी हो सकता है।

आप संकलक को केवल असेंबली (gcc -S उदाहरण के लिए) उत्पन्न करने के लिए या पहले से संकलित निष्पादन योग्य पर एक डिस्सेबलर का उपयोग करके किसी भी विशेष कार्यक्रम और कार्यान्वयन संयोजन के लिए स्वयं को समझ सकते हैं (लेकिन आपको स्रोत कोड की आवश्यकता होगी वैसे भी इसकी तुलना करें)।

संपादित

बस तुम क्या (कैसे समझ कोड की कई लाइनों एक आधुनिक प्रोसेसर एक सेकंड में निष्पादित कर सकते हैं) को पूरा करने के प्रयास कर रहे हैं के अपने स्पष्टीकरण के आधार पर इस पर विस्तार करने के लिए:

एक ओर जहां आधुनिक प्रोसेसर प्रति सेकंड 3 अरब चक्र चला सकता है जिसका मतलब यह नहीं है कि यह प्रति सेकंड 3 अरब निर्देश निष्पादित कर सकता है। यहां कुछ बातें ध्यान देने योग्य हैं:

  • कई निर्देश निष्पादित करने के लिए कई चक्र लेते हैं (विभाजन या फ़्लोटिंग पॉइंट ऑपरेशंस निष्पादित करने के लिए दर्जनों चक्र ले सकते हैं)।
  • अधिकांश कार्यक्रम मेमोरी एक्सेस, डिस्क एक्सेस इत्यादि जैसी चीजों के लिए अपने अधिकांश समय का इंतजार करते हैं।
  • ओएस ओवरहेड (शेड्यूलिंग, सिस्टम कॉल इत्यादि) सहित कई अन्य कारक भी सीमित कारक हैं।

लेकिन आम तौर पर प्रोसेसर अविश्वसनीय रूप से तेज़ होते हैं और कम समय में अद्भुत चीजें हासिल कर सकते हैं।

+0

जैसा कि कहा गया था, मैं किसी न किसी ballpark आंकड़े पूछ रहा था, और आपके अनुभवजन्य 2: 1 अनुपात पूरी तरह से मेरे सवाल का जवाब। आपके उत्तर के लिए धन्यवाद। –

+0

मुझे पूछना है, आप वास्तव में क्या करने की कोशिश कर रहे हैं? –

+0

चूंकि आप जोर देते हैं, मैं अपने सिर को लपेटने की कोशिश कर रहा हूं, व्यावहारिक शर्तों में, क्या कहता है - प्रसंस्करण शक्ति का 3GHz वास्तव में इसका मतलब है। अब, चाहे यह प्रति सेकंड एक अरब निर्देश है या उसमें से दसवां हिस्सा बिल्कुल कोई फर्क नहीं पड़ता है, क्योंकि यह एक मीट्रिक पागलपन है। –

4

यह बहुत भिन्न होता है! अगर किसी ने किसी न किसी रूपांतरण की पेशकश की तो मैंने किसी पर विश्वास नहीं किया।

i++; जैसे विवरण एक INC AX पर अनुवाद कर सकते हैं।

कई पैरामीटर वाले फ़ंक्शन कॉल के लिए विवरण कॉल के लिए स्टैक सेटअप के रूप में कई पैरामीटर हो सकते हैं।

फिर वहां कंपाइलर अनुकूलन जोड़ें जो आपके कोड को आपके द्वारा लिखे गए तरीके से अलग तरीके से इकट्ठा करेगा जिससे निर्देशों को समाप्त किया जा सके।

इसके अलावा कुछ निर्देश मशीन शब्द सीमाओं पर बेहतर चलते हैं, इसलिए NOP एस आपके कोड में पेपर किया जाएगा।

1

मुझे यकीन नहीं है कि वास्तव में इसका एक उपयोगी उत्तर है। निश्चित रूप से आपको आर्किटेक्चर चुनना होगा (जैसा आपने सुझाव दिया था)।

मैं क्या करूँगा: एक उचित आकार का सी प्रोग्राम लें। जीसीसी को "-एस" विकल्प दें और स्वयं को जांचें। यह असेंबलर स्रोत कोड उत्पन्न करेगा और आप स्वयं उस प्रोग्राम के अनुपात की गणना कर सकते हैं।

21

कोई जवाब नहीं है। int a; जैसे बयान शून्य एएसएम लाइनों की आवश्यकता हो सकती है। जबकि a = call_is_inlined(); जैसे बयान के लिए 20+ एएसएम लाइनों की आवश्यकता हो सकती है।

आप सी प्रोग्राम को संकलित करके और फिर objdump -Sd ./a.out शुरू करके स्वयं को देख सकते हैं।यह एएसएम और सी कोड इंटरमीस्ड प्रदर्शित करेगा, ताकि आप देख सकें कि एक सी लाइन के लिए कितनी एएसएम लाइनें उत्पन्न की जाती हैं। उदाहरण:

test.c

int get_int(int c); 
int main(void) { 
    int a = 1, b = 2; 
    return getCode(a) + b; 
} 

$ gcc -c -g test.c

$ objdump -Sd ./test.o

00000000 <main>: 
int get_int(int c); 
int main(void) { /* here, the prologue creates the frame for main */ 
    0: 8d 4c 24 04    lea 0x4(%esp),%ecx 
    4: 83 e4 f0    and $0xfffffff0,%esp 
    7: ff 71 fc    pushl -0x4(%ecx) 
    a: 55      push %ebp 
    b: 89 e5     mov %esp,%ebp 
    d: 51      push %ecx 
    e: 83 ec 14    sub $0x14,%esp 
    int a = 1, b = 2; /* setting up space for locals */ 
    11: c7 45 f4 01 00 00 00 movl $0x1,-0xc(%ebp) 
    18: c7 45 f8 02 00 00 00 movl $0x2,-0x8(%ebp) 
    return getCode(a) + b; 
    1f: 8b 45 f4    mov -0xc(%ebp),%eax 
    22: 89 04 24    mov %eax,(%esp) 
    25: e8 fc ff ff ff   call 26 <main+0x26> 
    2a: 03 45 f8    add -0x8(%ebp),%eax 
} /* the epilogue runs, returning to the previous frame */ 
    2d: 83 c4 14    add $0x14,%esp 
    30: 59      pop %ecx 
    31: 5d      pop %ebp 
    32: 8d 61 fc    lea -0x4(%ecx),%esp 
    35: c3      ret 
+0

आपके बहुत ज्वलंत उदाहरण के लिए धन्यवाद। हां, मुझे बॉलपार्क औसत पर अधिक दिलचस्पी थी, क्योंकि मुझे कुछ परिचालनों में ओवरहेड होने के बारे में पता है। जटिल कार्यों का उल्लेख नहीं है। लेकिन, फिर भी, मैं दावा करता हूं कि एएसएम: सी अनुपात कोड की पर्याप्त पंक्तियों के बाद अंततः पर्याप्त स्थिर हो जाता है। –

2

अपने परिवेश के आधार पर आप दृश्य स्टूडियो विकल्प इस्तेमाल कर सकते हैं:/एफएएस

अधिक here

3

मुझे नहीं लगता है कि तुम क्या से वास्तविक अनुप्रयोगों के प्रदर्शन के बारे में कुछ भी उपयोगी निष्कर्ष निकाल सकते हैं जो भी करते हैं आप यहाँ करने की कोशिश कर रहे हैं। 'सटीक नहीं' का अर्थ है 'परिमाण के कई आदेशों के भीतर'।

आप केवल सामान्य तरीके से अतिरेक हैं, और आप कैशिंग आदि को खारिज कर रहे हैं, भले ही यह माध्यमिक है, जबकि यह पूरी तरह से प्रभावी हो सकता है।

यदि आपका आवेदन इतना बड़ा कुछ औसत निर्देश-प्रति-loc को trended है करने के लिए है, तो यह भी काफी बड़ी आई/ओ या बहुत कम से कम महत्वपूर्ण रैम का उपयोग मुद्दों पर है करने के लिए कारकों पर विचार करना होगा।

1

आरआईएससी या सीआईएससी?सी में निर्देश क्या है, वैसे भी?

उपरोक्त बिंदुओं को दोहराना है जो आपको वास्तव में तब तक नहीं पता जब तक कि आप जिस प्रकार के कोड के साथ काम कर रहे हैं उसके बारे में आपको बहुत विशिष्ट न हो।

आप पिछले 30-40 वर्षों में असेंबली अनुकूलन और हार्डवेयर/सॉफ़्टवेयर हस्तक्षेप क्रॉस-टॉक के बारे में अकादमिक साहित्य की समीक्षा करने का प्रयास कर सकते हैं। यही वह जगह है जहां आपको रुचि रखने के बारे में कुछ वास्तविक डेटा मिल जाएगा। (हालांकि मैं आपको चेतावनी देता हूं, आप सी-> आईए -32 डेटा के बजाय सी-> पीडीपी डेटा देख सकते हैं)।

1

आपने एक टिप्पणी में लिखा है कि आप जानना चाहते हैं कि 3GHz का क्या अर्थ है।

सीपीयू की आवृत्ति भी कोई फर्क नहीं पड़ता। आधुनिक पीसी-सीपीयू इंटरलीव और अनुसूची निर्देशों को भारी रूप से, वे लाने और prefetch, कैश स्मृति और निर्देश और अक्सर कैश अवैध है और बिन को फेंक दिया जाता है। वास्तविक दुनिया प्रदर्शन बेंचमार्क चलाकर प्रसंस्करण शक्ति की सबसे अच्छी व्याख्या प्राप्त की जा सकती है।

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