विदेशी आर्किटेक्चर मानक समितियों की देखभाल करते हैं


154

मुझे पता है कि C और C ++ मानक भाषा कार्यान्वयन के कई पहलुओं को सिर्फ इसलिए परिभाषित करते हैं क्योंकि यदि अन्य विशेषताओं के साथ एक वास्तुकला है, तो इसके लिए एक मानक अनुरूप संकलक लिखना बहुत मुश्किल या असंभव होगा।

मुझे पता है कि 40 साल पहले किसी भी कंप्यूटर का अपना विशिष्ट विनिर्देश था। हालाँकि, मैं आज इस्तेमाल किए गए किसी भी आर्किटेक्चर के बारे में नहीं जानता:

  • CHAR_BIT != 8
  • signed दो पूरक नहीं है (मैंने सुना है कि जावा को इस एक के साथ समस्याएं थीं)।
  • फ्लोटिंग पॉइंट IEEE 754 अनुरूप नहीं है (संपादित करें: मेरा मतलब है "IEEE 754 बाइनरी एन्कोडिंग में नहीं")।

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

तो सवाल यह है कि क्या आर्किटेक्चर उपरोक्त गुणों का प्रदर्शन करते हैं?

uint*_tरों वैकल्पिक हैं।


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

8
@ जॉन: तो यह अव्यावहारिक होगा इसलिए गैर-मानक अनुरूप संकलक एक अनुरूपता की तुलना में तेजी से कोड उत्पन्न करेगा। और मैं अभी भी नहीं देखता कि यह आपके कोड को कैसे अधिक पोर्टेबल बनाता है।
याकोव गल्का

4
मुझे यकीन है कि मानक होने का असली कारण यह नहीं है क्योंकि यह कुछ आदर्श समाधान है। लेकिन इसके बजाय यह है क्योंकि जब मानक कई C और C ++ कंपाइलर पहले से ही लिखा गया था, और मानक समिति मौजूदा संकलक को अस्वीकार नहीं करना चाहती थी।
जॉन

4
@ जॉन: मुझे संदेह है कि "संकलक लेखकों के लिए इसे आसान बनाना" C ++ मानक बनाते समय एक प्राथमिकता है (वे एक भयानक काम कर रहे होंगे यदि यह थे, क्योंकि C ++ पार्स करने के लिए सबसे कठिन भाषाओं में से एक है, और अन्य पहलुओं भाषा कंपाइलर लेखकों के लिए बिल्कुल भी आसान नहीं है)। प्रदर्शन, व्यापक मंच का समर्थन, और पिछड़े संगतता हालांकि काफी महत्वपूर्ण हैं। और उन तीनों को नुकसान होगा यदि आपके द्वारा उल्लिखित प्रतिबंध (मानक) को मानक में जोड़ा जाएगा।
Sander De Dycker

5
यह संकलक के बारे में नहीं बल्कि हार्डवेयर है। C ++ हार्डवेयर सुविधाओं के प्रत्यक्ष उपयोग की अनुमति देने के लिए अनिर्दिष्ट कुछ चीजों को छोड़ देता है। आपका फ़ोन ऐप वैसे भी मेनफ़्रेम पर नहीं चलेगा, इसलिए पोर्टेबिलिटी कोड के अनुरूप नहीं है।
बो पर्सन

जवाबों:


114

इस पर एक नज़र डालो

Unisys ClearPath Dorado Servers

उन लोगों के लिए पिछड़े अनुकूलता की पेशकश करना, जिन्होंने अभी तक अपने सभी यूनीवैक सॉफ्टवेयर को माइग्रेट नहीं किया है।

प्रमुख बिंदु:

  • 36-बिट शब्द
  • CHAR_BIT == 9
  • किसी का पूरक
  • 72-बिट गैर-आईईईई अस्थायी बिंदु
  • कोड और डेटा के लिए अलग पता स्थान
  • शब्द-संबोधित
  • कोई समर्पित स्टैक पॉइंटर

हालांकि वे C ++ कंपाइलर की पेशकश करते हैं, लेकिन वे नहीं कर सकते


और अब उनके सी मैनुअल के हालिया संस्करण का लिंक सामने आया है:

यूनिसिस सी कंपाइलर प्रोग्रामिंग संदर्भ मैनुअल

धारा 4.5 में 9, 18, 36 और 72 बिट्स के साथ डेटा प्रकारों की एक तालिका है।

यूएससी सी कंपाइलर में आकार और डेटा प्रकार की सीमा


13
मुझे लगता है कि शून्य * उस वास्तुकला में उपयोग करने के लिए नारकीय होना चाहिए।
ल्यूसिबल

13
@ybungalobill - मेरा मानना ​​है कि char*और void*एक ही आकार होना चाहिए, और किसी भी अन्य सूचक को धारण करने के लिए काफी बड़ा होना चाहिए। बाकी क्रियान्वयन तक है।
बो पर्सन

22
@ybungalobill: पुराने Win16 कंपाइलरों पर, नियमित पॉइंटर्स पॉइंटर्स के पास थे और इसमें केवल 16-बिट ऑफसेट थे, इसलिए sizeof(int*) == 2, लेकिन अभी तक पॉइंटर्स में 16-बिट चयनकर्ता भी थे, इसलिए sizeof(void*) == 4
एडम रोसेनफील्ड Adam

10
उनके C ++ कंपाइलर के लिए एक ऑन-लाइन मैनुअल है, या उपयोग किया जाता है। यह भी इंगित करने योग्य है कि यह सिर्फ यूनिसिस मेनफ्रेम आर्किटेक्चर में से एक है: अन्य एक 48 बिट हस्ताक्षरित परिमाण में चिह्नित वास्तुकला है (जिसके लिए मैंने केवल एक सी मैनुअल पाया है, न कि सी ++ एक)। बाकी के बारे में: मुझे नहीं लगता कि sizeof(int*) != sizeof(char*)यहाँ: दोनों 36 बिट्स हैं। लेकिन बाइट चयनकर्ता char*उच्च क्रम बिट्स पर है, और इसमें अनदेखा किया गया है int*। (मैंने अन्य मशीनों का उपयोग किया है, हालाँकि, जहां `साइज़ोफ़ (चार *)> साइज़ोफ़ (इंट *)।)
जेम्स कान्जे

16
@ अदम रोसेनफील्ड MS / DOS 16 बिट संकलक पर, आपके पास अलग-अलग "मोड" थे, और डेटा पॉइंटर्स आवश्यक रूप से फ़ंक्शन पॉइंटर्स के समान आकार नहीं थे। लेकिन कम से कम जिन पर मैंने प्रयोग किया, उन सभी डेटा पॉइंटर्स (सहित void*) का आकार हमेशा एक जैसा था। (बेशक, आप एक फ़ंक्शन पॉइंटर को परिवर्तित नहीं कर सकते void*, क्योंकि void*यह छोटा हो सकता है। लेकिन मानक के अनुसार, आप आज, या तो नहीं कर सकते।)
जेम्स कांज़े

51

आपकी कोई भी धारणा मेनफ्रेम के लिए नहीं है। शुरुआत के लिए, मुझे आईईईई 754 का उपयोग करने वाली एक मेनफ्रेम का पता नहीं है: आईबीएम बेस 16 फ्लोटिंग पॉइंट का उपयोग करता है, और दोनों यूनिसिस मेनफ्रेम बेस का उपयोग करते हैं। Unisys मशीनें कई अन्य मामलों में थोड़ी विशेष हैं: बो ने 2200 का उल्लेख किया है वास्तुकला, लेकिन एमपीएस वास्तुकला भी अजनबी है: 48 बिट टैग शब्द। (शब्द सूचक है या नहीं यह शब्द में थोड़ा सा निर्भर करता है।) और संख्यात्मक निरूपण इस प्रकार तैयार किए गए हैं कि तैरने वाले बिंदु और अभिन्न अंकगणित के बीच कोई वास्तविक अंतर न हो: अस्थायी बिंदु आधार 8 है; इसे सामान्यीकरण की आवश्यकता नहीं है, और मैंने देखा है हर दूसरे अस्थायी बिंदु के विपरीत, यह दशमलव को बाईं ओर के बजाय मंटिसा के दाईं ओर रखता है, और प्रतिपादक (मंटिसा के अलावा) के लिए हस्ताक्षरित परिमाण का उपयोग करता है। उन परिणामों के साथ जो एक इंटीग्रल फ़्लोटिंग पॉइंट वैल्यू है (या हो सकता है) बिल्कुल एक हस्ताक्षरित परिमाण पूर्णांक के रूप में एक ही बिट प्रतिनिधित्व। और कोई अस्थायी बिंदु अंकगणितीय निर्देश नहीं हैं: यदि दो मानों के प्रतिपादक दोनों 0 हैं, तो निर्देश अभिन्न अंकगणित करता है, अन्यथा, यह अस्थायी अंक अंकगणित करता है। (वास्तुकला में टैगिंग दर्शन की निरंतरता।) जिसका अर्थ है कि जबकिint 48 बिट्स पर कब्जा कर सकते हैं, उनमें से 8 को 0 होना चाहिए, या मान को पूर्णांक के रूप में नहीं माना जाएगा।


4
आईबीएम मेनफ्रेम (z / आर्किटेक्चर) IEE754 फ्लोटिंग पॉइंट का समर्थन करता है।
निकिता नेमकिन

1
fyi

6
@ नीकिता - वे अब करते हैं । शुरू में यह जावा को सपोर्ट करने वाला (महंगा) ऐड था।
बो पर्सन


42

पूर्ण IEEE 754 अनुपालन फ्लोटिंग-पॉइंट कार्यान्वयन में दुर्लभ है। और उस संबंध में विनिर्देश को कमजोर करना बहुत सारे अनुकूलन की अनुमति देता है।

उदाहरण के लिए x87 और SSE के बीच सबमर्स सपोर्ट डिफरेंशियल।

ऑप्टिमाइज़ेशन जैसे फ़्यूज़िंग गुणा और जोड़ जो स्रोत कोड में अलग थे, परिणाम भी थोड़ा बदल देते हैं, लेकिन कुछ आर्किटेक्चर पर अच्छा अनुकूलन है।

या x86 पर सख्त IEEE अनुपालन के लिए कुछ बिंदुओं की आवश्यकता हो सकती है जो फ़्लोटिंग पॉइंट रजिस्टरों और सामान्य मेमोरी के बीच अतिरिक्त ट्रांसफ़र होते हैं, ताकि इसके आंतरिक 80bit फ़्लोट्स के बजाय निर्दिष्ट फ़्लोटिंग पॉइंट प्रकार का उपयोग करने के लिए मजबूर किया जा सके।

और कुछ प्लेटफार्मों में कोई हार्डवेयर फ़्लोट्स नहीं है और इसलिए उन्हें सॉफ़्टवेयर में अनुकरण करने की आवश्यकता है। और IEEE 754 की कुछ आवश्यकताएं सॉफ़्टवेयर में लागू करने के लिए महंगी हो सकती हैं। विशेष रूप से राउंडिंग नियम एक समस्या हो सकती है।

मेरा निष्कर्ष यह है कि स्थितियों में आने के लिए आपको विदेशी आर्किटेक्चर की आवश्यकता नहीं है, आप हमेशा सख्त IEEE अनुपालन की गारंटी नहीं देना चाहते हैं। इस कारण से कुछ प्रोग्रामिंग लैंग्वेज सख्त IEEE अनुपालन की गारंटी देती थीं।


7
हार्डवेयर का एक और "विदेशी" सेट आईबीएम मेनफ्रेम है जहां फ्लोटिंग पॉइंट प्रारूप IEEE मानक से पहले होता है। जावा के विपरीत, C ++ अभी भी मौजूदा हार्डवेयर का उपयोग कर सकता है।
बो पर्सन

5
IEEE 754 पूरी तरह से GPU द्वारा समर्थित नहीं है।
kerem

3
IEEE 754 के लिए सख्त अनुपालन की कमी कुछ को परेशान करती है, लेकिन मुझे नहीं लगता कि ओपी वास्तव में उन मुद्दों के दायरे में है जिनकी परवाह है।
सर्वव्यापी

3
@Matthieu चूंकि इसे "C" भी टैग किया गया है, मुझे एक C विश्लेषक का उल्लेख करना चाहिए जो आपको बता सकता है कि आपके फ़्लोटिंग-पॉइंट प्रोग्राम के सभी मान 80 बिट्स फ़्लोटिंग-पॉइंट रजिस्टरों के साथ ले सकते हैं जो कि सी कंपाइलर की सीटी पर मेमोरी के लिए दिए गए हैं। blog.frama-c.com/index.php?post/2011/03/03/cosine-for-real
पास्कल क्यूक

2
@ मैथ्यूएमएम: यह बहुत बुरा है आईएसओ / एएनएसआई ने वैरिएड मापदंडों को फ्लोटिंग-पॉइंट और पूर्णांक तर्क के लिए न्यूनतम / अधिकतम आकार निर्दिष्ट करने की अनुमति नहीं दी; यदि उनके पास होता, तो 80-बिट long doubleएक उपयोगी और लंबे समय तक रहने वाला प्रकार हो सकता था, क्योंकि इसके साथ एक वास्तविक समस्या यह थी कि यह बुरी तरह से काम करता है printf। यह तथ्य कि विस्तारित डबल स्टोर प्रमुख 1 गैर-एफपीयू प्रणालियों पर गणना को गति देता है और रूपांतरणों के अलावा किसी भी संदर्भ में / अन्य प्रकारों से किसी भी संदर्भ में विशेष हैंडलिंग की आवश्यकता को समाप्त करेगा। बहुत बुरा है सी printfसब गड़बड़ है।
सुपरकैट

40

मैंने पाया इस लिंक कुछ सिस्टम लिस्टिंग जहां CHAR_BIT != 8। उनमे शामिल है

कुछ टीआई डीएसपी हैं CHAR_BIT == 16

ब्लूकोर -5 चिप (कैम्ब्रिज सिलिकॉन रेडियो से एक ब्लूटूथ चिप) जिसमें है CHAR_BIT == 16

और निश्चित रूप से स्टैक ओवरफ्लो पर एक सवाल है: क्या प्लेटफार्मों में 8-बिट चार के अलावा कुछ है

नॉन टू-सप्लीमेंट सिस्टम के लिए comp.lang.c ++ पर एक दिलचस्प रीड है । सारांशित: ऐसे प्लेटफ़ॉर्म हैं जिनके पास पूरक या संकेत और परिमाण प्रतिनिधित्व हैं।


5
एनालॉग डिवाइसेस 32-बिट SHARC DSP में है CHAR_BIT=32, और TMS32F28xx से टेक्सास इंस्ट्रूमेंट्स DSP है CHAR_BIT=16। पीडीपी -10 के लिए जीसीसी 3.2 है CHAR_BIT=9। मुझे लगता है, S / 360 में नॉट -8 बिट भी हो सकता है।
ऑस्कैक्स

1
मैं अब भी 'गैर-दो पूरक' आर्किटेक्चर के लिए एक उदाहरण चाहूंगा। खासकर जब से यह हुआ है कि CHAR_BITSएक आंशिक डुप्लिकेट है।
याकोव गल्का

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

24

मुझे पूरा यकीन है कि VAX सिस्टम अभी भी उपयोग में हैं। वे IEEE फ़्लोटिंग पॉइंट का समर्थन नहीं करते हैं; वे अपने स्वयं के स्वरूपों का उपयोग करते हैं। अल्फा VAX और IEEE दोनों फ्लोटिंग-पॉइंट फॉर्मेट का समर्थन करता है।

टी 90 की तरह क्रे वेक्टर मशीन का भी अपना फ्लोटिंग-पॉइंट प्रारूप है, हालांकि नए क्रे सिस्टम आईईईई का उपयोग करते हैं। (कुछ वर्षों पहले मैंने जो T90 का उपयोग किया था, उसका डीमोशन किया गया था; मुझे नहीं पता कि कोई अभी भी सक्रिय उपयोग में है।)

T90 में पॉइंटर्स और पूर्णांक के लिए कुछ दिलचस्प अभ्यावेदन भी थे। एक देशी पता केवल 64-बिट शब्द को इंगित कर सकता है। C और C ++ कंपाइलरों में CHAR_BIT == 8 (आवश्यक था क्योंकि यह यूनिक्स को चलाता था, यूनिक्स का स्वाद था, और अन्य प्रणालियों के साथ हस्तक्षेप करना था), लेकिन एक मूल पता केवल 64-बिट शब्द को इंगित कर सकता था। सभी बाइट स्तर के संचालन को संकलक द्वारा संश्लेषित किया गया था, void*या char*शब्द के उच्च-क्रम 3 बिट्स में एक बाइट ऑफसेट को संग्रहीत किया गया था। और मुझे लगता है कि कुछ पूर्णांक प्रकारों में बिटिंग बिट्स थे।

आईबीएम मेनफ्रेम एक और उदाहरण है।

दूसरी ओर, इन विशेष प्रणालियों को भाषा मानक में आवश्यक रूप से परिवर्तन करने की आवश्यकता नहीं है । क्रे ने C99 में अपने C कंपाइलर को अपग्रेड करने में कोई खास दिलचस्पी नहीं दिखाई; संभवतः सी ++ संकलक के लिए एक ही बात लागू होती है। यह होस्ट किए गए कार्यान्वयन के लिए आवश्यकताओं को कसने के लिए उचित हो सकता है, जैसे कि CHAR_BIT == 8, IEEE प्रारूप फ़्लोटिंग पॉइंट की आवश्यकता होती है, यदि पूर्ण शब्दार्थ नहीं है, और हस्ताक्षर किए पूर्णांक के लिए पैडिंग बिट्स के बिना 2-पूरक है। पुरानी प्रणालियाँ पहले के भाषा मानकों का समर्थन करना जारी रख सकती हैं (C90 के बाहर आने पर C90 की मृत्यु नहीं हुई), और आवश्यकताओं को डीएसपी जैसे फ्रीस्टैंडिंग कार्यान्वयन (एम्बेडेड सिस्टम) के लिए शिथिल किया जा सकता है।

दूसरी ओर, भविष्य की प्रणालियों के लिए उन चीजों को करने के अच्छे कारण हो सकते हैं जिन्हें आज विदेशी माना जाएगा।


6
अंत में अच्छी बात यह है कि कैसे सख्त मानकों नवाचार को रोकते हैं। जब हम त्रिशंकु राज्यों के साथ क्वांटम (या कार्बनिक) कंप्यूटर प्राप्त करते हैं, तो unsignedअभिन्न प्रकारों के लिए मोडुलो अंकगणितीय आवश्यकताओं को एक बड़ा दर्द होगा, जबकि हस्ताक्षरित अंकगणित बस ठीक होगा।
बेन वोइगेट

@BenVoigt अहस्ताक्षरित अंकगणित एक दर्द क्यों है? उन कंप्यूटरों में modulo 3 ^ n योजक संभव नहीं है?
phuclv

2
@ LưuV LnhPhúc: यह बिल्कुल वही बिंदु है, जिसमें हार्डवेयर ऑपरेशंस ने modulo 3 ** n का प्रदर्शन किया है, जो C ++ को अहस्ताक्षरित प्रकार प्रदान करता है, जिनके संचालन को modulo 2 ** n परिभाषित किया जाता है।
बेन वोइगट

2
मैं एक वैक्स 11/780 को अभी भी एक मालिकाना वास्तुकला के साथ एक विशेष एम्बेडेड सिस्टम को लक्षित करने वाले क्रॉस कंपाइलर के लिए एक मेजबान के रूप में उपयोग करता हूं। उस विशेष वैक्स को बनाए रखने के लिए कस्टोडियन पुर्जों के लिए संग्रहालयों से संपर्क कर रहे हैं।
पीटर

2
@ कीथ - तकनीकी रूप से, एकमात्र बाधा सबूत प्रदान करने के लिए एक प्रक्रिया से गुजर रही है जो नियामक आवश्यकताओं को पूरा करेगी, क्योंकि लक्ष्य एम्बेडेड सिस्टम उच्च जीवन शक्ति है। हालांकि, गैर-तकनीकी बाधाओं (संगठनात्मक राजनीति, आदि) का एक समूह हैं, हालांकि, आज तक यह असंभव है। वर्तमान में होस्ट को अपडेट करने की तुलना में संग्रहालयों पर छापा मारना आसान है।
पीटर

16

CHAR_BITS

Gcc स्रोत कोड के अनुसार :

CHAR_BITहै 16के लिए बिट्स 1750a , dsp16xx आर्किटेक्चर।
CHAR_BITहै 24के लिए बिट्स dsp56k वास्तुकला।
CHAR_BITहै 32के लिए बिट्स c4x वास्तुकला।

आप आसानी से अधिक कर पा सकते हैं:

find $GCC_SOURCE_TREE -type f | xargs grep "#define CHAR_TYPE_SIZE"

या

find $GCC_SOURCE_TREE -type f | xargs grep "#define BITS_PER_UNIT"

यदि CHAR_TYPE_SIZEउचित रूप से परिभाषित किया गया है।

IEEE 754 अनुपालन

यदि लक्ष्य आर्किटेक्चर फ्लोटिंग पॉइंट निर्देशों का समर्थन नहीं करता है, तो जीसीसी सॉफ़्टवेयर फ़ॉलबैक डायन उत्पन्न कर सकता है जो डिफ़ॉल्ट रूप से मानक अनुपालन नहीं है। से अधिक, विशेष विकल्प (जैसे -funsafe-math-optimizationsडायन भी शून्य के लिए साइन संरक्षण को अक्षम करता है) का उपयोग किया जा सकता है।


3
एक लोकप्रिय संकलक के स्रोत को देखने के लिए केवल ओपी को निर्देश देने के लिए upvoted; यह इस मामले में RFTM की परिभाषा है, इसलिए यह लोगों को देखने का पहला स्थान होना चाहिए।
अंडरस्कोर_ड

9

GPU पर IEEE 754 बाइनरी प्रतिनिधित्व असामान्य था, हाल ही में, GPU फ़्लोटिंग-प्वाइंट व्यामोह देखें

EDIT: टिप्पणियों में एक सवाल उठाया गया है कि क्या GPU फ़्लोटिंग पॉइंट सामान्य कंप्यूटर प्रोग्रामिंग के लिए प्रासंगिक है, जो ग्राफिक्स से संबंधित नहीं है। अरे हाँ! आज औद्योगिक रूप से गणना की जाने वाली अधिकांश उच्च प्रदर्शन वाली चीजें जीपीयू पर की जाती हैं; सूची में AI, डाटा माइनिंग, न्यूरल नेटवर्क, फिजिकल सिम्यूलेशन, वेदर फोरकास्ट और भी बहुत कुछ शामिल है। टिप्पणियों में एक लिंक से पता चलता है कि क्यों: जीपीयू के फ्लोटिंग पॉइंट लाभ का एक क्रम

एक और बात मैं जोड़ना चाहूंगा, जो ओपी प्रश्न के लिए अधिक प्रासंगिक है: 10-15 साल पहले लोगों ने क्या किया था जब GPU फ़्लोटिंग पॉइंट IEEE नहीं था और जब GPU को प्रोग्राम करने के लिए आज की OpenCL या CUDA जैसी कोई एपीआई नहीं थी? मानो या न मानो, जल्दी GPU कंप्यूटिंग अग्रदूतों कि ऐसा करने के लिए एक एपीआई के बिना GPUs कार्यक्रम में कामयाब रहे ! मैं उनमें से एक से अपनी कंपनी में मिला। यहाँ उसने क्या किया: उसने उस डेटा को एन्कोड किया जिसकी उसे पिक्सल के साथ एक छवि के रूप में गणना करने की जरूरत थी, जिसमें वह काम कर रहे मूल्यों का प्रतिनिधित्व करता था, फिर ओपनगेल का उपयोग वह ऑपरेशन करने के लिए करता था जिसकी उसे जरूरत थी (जैसे कि "गॉसियन ब्लर") एक सामान्य वितरण के साथ एक कन्वेंशन का प्रतिनिधित्व करने के लिए , आदि), और परिणामी छवि को वापस परिणाम की एक सरणी में डिकोड किया। और यह अभी भी सीपीयू का उपयोग करने से तेज था!

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


जीपीयू कैसे प्रासंगिक हैं? (a) यह पृष्ठ बहुत पुराना लगता है । (b) इस दिन तक आप C में GPU को प्रोग्राम नहीं कर सकते हैं: क्योंकि C ऐसे सामानों का समर्थन करता है जैसे कि पुनरावर्ती कार्य जो कि GPUs, मेरी जानकारी के अनुसार, सर्वश्रेष्ठ नहीं है। यदि आप चाहते हैं तो आप एक कंपाइलर भी नहीं लिख सकते।
याकोव गल्का

1
@ybungalobill, GPU के लिए दोहराए जाने वाले काम को लोड करना वर्तमान में बड़े पैमाने पर गणना के लिए पसंदीदा तरीका है । वास्तव में, मैं वर्तमान में C ++ में एक विकसित कर रहा हूं। सौभाग्य से, हम केवल NVidia CUDA GPU के साथ काम करते हैं जिसमें IEEE 754 संगत बाइनरी प्रतिनिधित्व है।
माइकल

मैं नहीं कहता कि जीपीयू का उपयोग जीपी-कंप्यूटेशन के लिए नहीं किया जाता है। मैंने कहा कि आप वाक्यविन्यास समानता के बावजूद, वास्तव में सी में गुठली को प्रोग्राम नहीं करते हैं। क्या आप int f(int n) { return n <= 1 ? 1 : n * f(n-1); }CUDA में निष्पादित कर सकते हैं ? यदि नहीं, तो GPUs इस प्रश्न के लिए प्रासंगिक नहीं हैं (जो C और C ++ समितियों के बारे में पूछता है)।
यकॉव गल्का

6
@ybungalobill: उस के लिए कई जवाब। सबसे पहले, CUDA C, C ++ और फोरट्रान का समर्थन करता है । अपने सामान्य 8-थ्रेड CPU पर 2048-थ्रेड GPU के प्रदर्शन के लाभ के लिए एक ही लिंक देखें। उन भाषाओं का दूसरा, सही, केवल सबसेट (यद्यपि बड़े लोगों) का समर्थन किया जाता है, जिसमें CUDA 5.0 तक CUDA प्रोग्रामिंग मॉडल रिकर्सन (जिसे "डायनेमिक समांतरवाद" कहा जाता है) के लिए समर्थन की कमी शामिल है। तीसरा, पुनरावर्ती को आम तौर पर छोरों द्वारा प्रतिस्थापित किया जा सकता है, जो कि वैसे भी बहुप्रतीक्षित पूर्णता के लिए आवश्यक है।
माइकल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.