GPU कंप्यूटिंग के लिए किस प्रकार की समस्याएं खुद को अच्छी तरह से उधार देती हैं?


84

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

मुझे पता है कि यह एक बुनियादी सवाल है, लेकिन मेरी खोज में बहुत से लोग स्पष्ट रूप से क्यों , या कुछ हद तक अंगूठे के नियमों को सही ठहराए बिना स्पष्ट रूप से एक या दूसरे के लिए वकालत करते हुए पकड़े जाते हैं । यहां अधिक उपयोगी प्रतिक्रिया की तलाश है।

जवाबों:


63

जीपीयू हार्डवेयर की दो खास खूबियां हैं: रॉ कंप्यूट (FLOPs) और मेमोरी बैंडविड्थ। अधिकांश कठिन कम्प्यूटेशनल समस्याएं इन दो श्रेणियों में से एक में आती हैं। उदाहरण के लिए, घने रेखीय बीजगणित (A * B = C या सॉल्यूशन [Ax = y] या Diagonalize [A], आदि) सिस्टम आकार के आधार पर कंप्यूट / मेमोरी बैंडविड्थ स्पेक्ट्रम पर कहीं गिरता है। फास्ट फूरियर ट्रांसफॉर्म (एफएफटी) भी इस सांचे को उच्च एग्रीगेट बैंडविड्थ आवश्यकताओं के साथ फिट करते हैं। जैसा कि अन्य परिवर्तनों, ग्रिड / मेष-आधारित एल्गोरिदम, मोंटे कार्लो, आदि हैं। यदि आप NVIDIA के एसडीके कोड उदाहरणों को देखते हैं , तो आप उन समस्याओं के प्रकार के बारे में महसूस कर सकते हैं जो सबसे अधिक संबोधित हैं।

मुझे लगता है कि अधिक शिक्षाप्रद उत्तर इस सवाल का है `जीपीयू वास्तव में किस प्रकार की समस्याएं हैं? ' अधिकांश समस्याएं जो इस श्रेणी में नहीं आती हैं, उन्हें GPU पर चलाने के लिए बनाया जा सकता है, हालांकि कुछ अन्य की तुलना में अधिक प्रयास करते हैं।

समस्याएँ जो अच्छी तरह से मानचित्र नहीं करती हैं वे आम तौर पर बहुत छोटी या बहुत अप्रत्याशित होती हैं। बहुत छोटी समस्याओं में GPU पर सभी थ्रेड्स का उपयोग करने के लिए आवश्यक समानता की कमी होती है और / या CPU पर निम्न स्तर के कैश में फिट हो सकता है, CPU प्रदर्शन को काफी बढ़ा देता है। अप्रत्याशित समस्याओं की बहुत अधिक सार्थक शाखाएँ हैं, जो डेटा को GPU मेमोरी से कोर में स्ट्रीमिंग करने या SIMD प्रतिमान को तोड़कर समानता को कम करने से कुशलता से रोक सकती हैं (देखें ' डिवर्जेंट वॉरप्स ')। इस प्रकार की समस्याओं के उदाहरणों में शामिल हैं:

  • अधिकांश ग्राफ एल्गोरिदम (बहुत अप्रत्याशित, विशेष रूप से मेमोरी-स्पेस में)
  • विरल रैखिक बीजगणित (लेकिन यह सीपीयू पर भी बुरा है)
  • छोटी सिग्नल प्रोसेसिंग समस्याएं (उदाहरण के लिए, 1000 अंकों से छोटी FFT)
  • खोज
  • तरह

3
फिर भी, उन "अप्रत्याशित" समस्याओं के लिए GPU समाधान कर रहे हैं संभव है और, जबकि आजकल आम तौर पर संभव नहीं, भविष्य में महत्व प्राप्त कर सकते हैं।
लेफ्टनैस्टाबाउट

6
मैं विशेष रूप से GPU प्रदर्शन तोड़ने वालों की सूची में शाखाओं को जोड़ना चाहूंगा। आप चाहते हैं कि आपके सभी (सैकड़ों) एक ही निर्देश को निष्पादित करें (जैसा कि SIMD में) सही मायने में समानांतर गणना करने के लिए। उदाहरण के लिए, एएमडी कार्डों पर यदि कोई निर्देश प्रवाह करता है तो एक शाखा का सामना करना पड़ता है और इसे डायवर्ज करना चाहिए - सभी वेवफ्रंट (समानांतर समूह) डायवर्ज। यदि वेवफ्रंट की अन्य इकाइयाँ को विचलन नहीं करना चाहिए - तो उन्हें दूसरा पास करना होगा। यही कारण है कि मैक्किच का मतलब है कि भविष्यवाणी से, मुझे लगता है।
वायलेट जिराफ

2
@ वायलेटगिरीफ, यह जरूरी नहीं कि सच हो। CUDA (यानी एनवीडिया जीपीयू पर), शाखा विचलन केवल वर्तमान ताना को प्रभावित करता है, जो कि सबसे अधिक 32 लड़ाइयों में होता है। अलग-अलग ताना, हालांकि एक ही कोड को निष्पादित करते हैं, जब तक कि स्पष्ट रूप से सिंक्रनाइज़ नहीं किया जाता है (जैसे कि __synchtreads())।
पेड्रो

1
@ पेड्रो: यह सच है, लेकिन सामान्य रूप से शाखा करने से प्रदर्शन को नुकसान पहुंचता है । उच्च-प्रदर्शन कोड (क्या GPU कोड नहीं है?) के लिए, इसे ध्यान में रखना आवश्यक है।
jvriesem

21

जिन समस्याओं में एक उच्च अंकगणितीय तीव्रता और नियमित मेमोरी एक्सेस पैटर्न होते हैं, वे आमतौर पर GPU पर लागू करने के लिए आसान (ier) होते हैं, और उन पर अच्छा प्रदर्शन करते हैं।

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


क्या आप निर्दिष्ट कर सकते हैं कि नियमित मेमोरी एक्सेस पैटर्न से आपका क्या मतलब है?
फोमाइट

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

15

यह अपने आप में एक उत्तर के रूप में लक्षित नहीं है, बल्कि मैक्सहच और रीड.एक्टसन द्वारा अन्य उत्तरों के अतिरिक्त है ।

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

अधिक सटीक होने के लिए, कर्नेल को GPU के प्रत्येक मल्टीप्रोसेसिंग यूनिट (या कंप्यूट यूनिट ) के रजिस्टर में फिट होना चाहिए । रजिस्टर का सटीक आकार GPU पर निर्भर है।

कर्नेल काफी छोटा है, समस्या के कच्चे डेटा को GPU की स्थानीय मेमोरी (पढ़ने के लिए: स्थानीय मेमोरी (OpenCL) या एक गणना इकाई की साझा मेमोरी (CUDA) में फिट करने की आवश्यकता है । अन्यथा, GPU की उच्च मेमोरी बैंडविड्थ भी तेजी से पर्याप्त नहीं है ताकि प्रसंस्करण तत्वों को हर समय व्यस्त रखा जा सके।
आमतौर पर यह मेमोरी 16 से 32 KiByte बड़ी होती है


प्रत्येक प्रसंस्करण इकाई की स्थानीय / साझा स्मृति कोर के एक क्लस्टर के भीतर चलने वाले धागे के दर्जनों (?) के सभी के बीच साझा नहीं है? इस स्थिति में, क्या आपको वास्तव में GPU से पूर्ण प्रदर्शन प्राप्त करने के लिए डेटा के अपने कामकाजी सेट को काफी छोटा रखने की आवश्यकता नहीं है?
दान नीली

एक प्रसंस्करण इकाई की स्थानीय / साझा की गई मेमोरी केवल कम्प्यूट यूनिट द्वारा ही सुलभ है और इस प्रकार केवल इस कम्प्यूट यूनिट के प्रसंस्करण तत्वों द्वारा साझा की जाती है। ग्राफिक्स कार्ड की वैश्विक मेमोरी (आमतौर पर 1 जीबी) सभी प्रसंस्करण इकाइयों द्वारा सुलभ है। प्रसंस्करण तत्वों और स्थानीय / साझा मेमोरी के बीच बैंडविड्थ बहुत तेज़ है (> 1TB / s) लेकिन वैश्विक मेमोरी के लिए बैंडविड्थ बहुत धीमी (~ 100GB / s) है और सभी कंप्यूट इकाइयों के बीच साझा करने की आवश्यकता है।
Torbjörn

मैं मुख्य GPU मेमोरी के बारे में नहीं पूछ रहा था। मैंने सोचा था कि डाई मेमोरी केवल कोर के स्तर पर आवंटित की गई थी न कि व्यक्तिगत कोर के हिसाब से। एक nVidia GF100 / 110 gpu के लिए पूर्व; प्रत्येक 16 एसएम समूहों के लिए 512 क्यूडा कोर नहीं है। प्रत्येक एसएम के साथ समानांतर अधिकतम जीपीयू प्रदर्शन में 32 थ्रेड तक चलाने के लिए डिज़ाइन किया गया है, जिसे 1kb / थ्रेड रेंज में वर्किंग सेट रखने की आवश्यकता होगी।
डैन नीली

@Torbjoern क्या आप चाहते हैं कि सभी GPU निष्पादन पाइपलाइनों को व्यस्त रखना है, GPU यह दो तरीके हासिल करते हैं: (1) सबसे आम तरीका अधिभोग को बढ़ाना है, या अलग-अलग कहा जाता है, समवर्ती धागे की संख्या में वृद्धि करके (छोटे गुठली का कम उपयोग करते हैं) साझा संसाधन ताकि आपके पास अधिक सक्रिय धागे हो सकते हैं); शायद बेहतर है, (2) अपने कर्नेल के भीतर अनुदेश स्तर समानता को बढ़ाएं, ताकि आप अपेक्षाकृत कम ऑक्यूपेंसी (सक्रिय थ्रेड्स की छोटी संख्या) के साथ बड़ा कर्नेल रख सकें। Bit.ly/Q3KdI0
fcruz

11

संभवतः पिछले उत्तरों के लिए एक अधिक तकनीकी जोड़: CUDA (यानी एनवीडिया) जीपीयू को उन प्रोसेसरों के एक सेट के रूप में वर्णित किया जा सकता है जो 32 थ्रेड्स पर स्वायत्त रूप से काम करते हैं। प्रत्येक प्रोसेसर में थ्रेड लॉक-स्टेप (लंबाई 32 के वैक्टर के साथ SIMD) पर काम करते हैं।

हालांकि GPUs के साथ काम करने का सबसे लुभावना तरीका यह है कि लॉक-स्टेप में सब कुछ चलता है, लेकिन यह हमेशा चीजों को करने का सबसे कारगर तरीका नहीं है।

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

यहाँ एक छोटा सा उदाहरण है, CUDA का उपयोग करके, यह कैसे काम करता है

/* Global index of the next available task, assume this has been set to
   zero before spawning the kernel. */
__device__ int next_task;

/* We will use this value as our mutex variable. Assume it has been set to
   zero before spawning the kernel. */
__device__ int tasks_mutex;

/* Mutex routines using atomic compare-and-set. */
__device__ inline void cuda_mutex_lock ( int *m ) {
    while ( atomicCAS( m , 0 , 1 ) != 0 );
    }
__device__ inline void cuda_mutex_unlock ( int *m ) {
    atomicExch( m , 0 );
    }

__device__ void task_do ( struct task *t ) {

    /* Do whatever needs to be done for the task t using the 32 threads of
       a single warp. */
    }

__global__ void main ( struct task *tasks , int nr_tasks ) {

    __shared__ task_id;

    /* Main task loop... */
    while ( next_task < nr_tasks ) {

        /* The first thread in this block is responsible for picking-up a task. */
        if ( threadIdx.x == 0 ) {

            /* Get a hold of the task mutex. */
            cuda_mutex_lock( &tasks_mutex );

            /* Store the next task in the shared task_id variable so that all
               threads in this warp can see it. */
            task_id = next_task;

            /* Increase the task counter. */
            next_tast += 1;

            /* Make sure those last two writes to local and global memory can
               be seen by everybody. */
            __threadfence();

            /* Unlock the task mutex. */
            cuda_mutex_unlock( &tasks_mutex );

            }

        /* As of here, all threads in this warp are back in sync, so if we
           got a valid task, perform it. */
        if ( task_id < nr_tasks )
            task_do( &tasks[ task_id ] );

        } /* main loop. */

    }

फिर आपको कर्नेल main<<<N,32>>>(tasks,nr_tasks)को यह सुनिश्चित करने के लिए कॉल करना होगा कि प्रत्येक ब्लॉक में केवल 32 धागे हैं और इस तरह एक ही ताना में फिट बैठता है। इस उदाहरण में मैंने यह भी माना कि, सादगी के लिए, कि कार्यों में कोई निर्भरता नहीं है (उदाहरण के लिए, एक कार्य दूसरे के परिणामों पर निर्भर करता है) या संघर्ष (जैसे एक ही वैश्विक मेमोरी पर काम)। यदि यह मामला है, तो कार्य चयन थोड़ा अधिक जटिल हो जाता है, लेकिन संरचना अनिवार्य रूप से समान है।

यह निश्चित रूप से, कोशिकाओं के एक बड़े बैच पर सब कुछ करने की तुलना में अधिक जटिल है, लेकिन महत्वपूर्ण रूप से उन समस्याओं के प्रकार को व्यापक करता है जिनके लिए जीपीयू का उपयोग किया जा सकता है।


2
यह तकनीकी रूप से सच है, लेकिन उच्च मेमोरी बैंडविड्थ प्राप्त करने के लिए उच्च समानता की आवश्यकता होती है और अतुल्यकालिक कर्नेल कॉल की संख्या की सीमा होती है (वर्तमान में 16)। वे भी वर्तमान रिलीज़ में शेड्यूलिंग से संबंधित अनैच्छिक व्यवहार के टन हैं। मैं अतुल्यकालिक गुठली पर भरोसा करने के खिलाफ कुछ समय के लिए प्रदर्शन करने की सलाह देता हूं ...
मैक्स हचिंसन

2
मैं जो वर्णन कर रहा हूं वह सभी एक ही कर्नेल कॉल में किया जा सकता है। आप 32 थ्रेड्स के एन ब्लॉक बना सकते हैं, जैसे कि प्रत्येक ब्लॉक एक ही ताना में फिट बैठता है। प्रत्येक ब्लॉक तब एक वैश्विक कार्य सूची (एटमिक्स / म्यूटेक्स का उपयोग करके नियंत्रित) से एक कार्य प्राप्त करता है और 32 लॉक-स्टेप थ्रेड्स का उपयोग करके गणना करता है। यह सब एक कर्नेल कॉल में होता है। यदि आप एक कोड उदाहरण चाहते हैं, तो मुझे बताएं और मैं एक पोस्ट करूंगा।
पेड्रो

4

एक बिंदु अभी तक नहीं बनाया गया है कि GPU की वर्तमान पीढ़ी एकल परिशुद्धता संगणना के साथ डबल सटीक फ़्लोटिंग पॉइंट कंप्यूटेशन पर भी नहीं करती है। यदि आपकी गणना को दोहरी सटीकता में किया जाना है, तो आप रन टाइम को 10 या एक से अधिक परिशुद्धता के कारक से बढ़ा सकते हैं।


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

1
हालांकि यह सच है कि नवीनतम और सबसे बड़ी एनवीडिया टेस्ला कार्ड शिखर डबल सटीक प्रदर्शन की पेशकश करते हैं जो कि चोटी के एकल सटीक प्रदर्शन का आधा है, अनुपात अधिक सामान्य फ़र्मि वास्तुकला उपभोक्ता ग्रेड कार्ड के लिए 8 से 1 है।
ब्रायन बोरचर्स

@GodricSeer एसपी और डीपी फ्लोटिंग-पॉइंट के 2: 1 अनुपात का बैंडविड्थ के साथ बहुत कम संबंध है और इन ऑपरेशनों को अंजाम देने के लिए कितने हार्डवेयर यूनिट मौजूद हैं। एसपी और डीपी के लिए रजिस्टर फ़ाइल का पुन: उपयोग करना आम है, इसलिए फ्लोटिंग-पॉइंट यूनिट 2x को एसपी ऑप्स को डीपी ऑप्स के रूप में निष्पादित कर सकता है। इस डिज़ाइन के कई अपवाद हैं, उदाहरण के लिए IBM Blue Gene / Q (जिसमें SP तर्क नहीं है और इस प्रकार SP ~ 1.05x DP पर चलता है)। कुछ GPU में 2, उदा 3 और 5 के अलावा अन्य अनुपात होते हैं
जेफ

यह उत्तर लिखने के चार साल बाद का समय है, और NVIDIA GPU के साथ वर्तमान स्थिति यह है कि GeForce और Quadro लाइनों के लिए DP / SP अनुपात अब 1/32 है। NVIDIA के टेस्ला जीपीयू में डबल प्रिसिजन परफॉर्मेंस काफी मजबूत है, लेकिन इसकी कीमत भी ज्यादा है। दूसरी ओर, AMD ने अपने Radeon GPU के उसी तरह दोहरे प्रदर्शन को अपंग नहीं किया है।
ब्रायन बोरचर्स

4

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

इसे ऊपर दिए गए उत्कृष्ट उत्तरों के पूरक उत्तर के रूप में लिया जा सकता है।


4

पुराना सवाल है, लेकिन मुझे लगता है कि यह जवाब 2014 से है - सांख्यिकीय विधियों से संबंधित है, लेकिन जो कोई भी जानता है कि लूप क्या है - के लिए सामान्य रूप से विशेष रूप से चित्रण और जानकारीपूर्ण है।


2

GPU में लंबे समय तक विलंबता I / O होती है, इसलिए मेमोरी को संतृप्त करने के लिए बहुत सारे थ्रेड्स का उपयोग करने की आवश्यकता होती है। एक ताना रखने के लिए बहुत सारे धागे की आवश्यकता होती है। यदि कोड पथ 10 घड़ियां और I / O विलंबता 320 घड़ियां हैं, तो 32 थ्रेड्स ताना को संतृप्त करने के करीब आना चाहिए। यदि कोड पथ 5 घड़ियां हैं, तो थ्रेड्स को दोगुना करें।

एक हजार कोर के साथ, GPU का पूरी तरह से उपयोग करने के लिए हजारों धागे देखें।

मेमोरी एक्सेस कैश लाइन द्वारा, आमतौर पर 32 बाइट्स होती है। लोड हो रहा है एक बाइट में 32 बाइट्स के लिए तुलनीय लागत है। इसलिए, उपयोग की स्थानीयता बढ़ाने के लिए भंडारण को सीमित करें।

प्रत्येक ताना के बहुत सारे रजिस्टर और स्थानीय रैम हैं, जो पड़ोसी साझा करने की अनुमति देता है।

बड़े सेट के निकटता सिमुलेशन को अच्छी तरह से अनुकूलन करना चाहिए।

रैंडम I / O और एकल थ्रेडिंग एक मार खुशी है ...


यह वास्तव में आकर्षक सवाल है; मैं अपने आप से बहस कर रहा हूं कि क्या यह संभव है (या प्रयास के लायक) 'समानांतर-ise' यथोचित सीधा कार्य (हवाई छवियों में बढ़त का पता लगाने) जब प्रत्येक कार्य ~ 0.06sec लेता है, लेकिन प्रदर्शन करने के लिए ~ 1.8 मिलियन कार्य हैं प्रति वर्ष, 6 साल के डेटा के लिए: कार्य निश्चित रूप से वियोज्य हैं) ... इस प्रकार एक कोर पर गणना समय के ~ ~ 7.5 दिन का मूल्य। यदि प्रत्येक कैल्क एक GPU पर तेज था, और नौकरी को 1-प्रति-nPPUcores [n छोटा] के समानांतर किया जा सकता है, तो क्या वास्तव में संभावना है कि नौकरी का समय ~ 1 घंटे तक कम हो सकता है? संभावना नहीं लगती है।
जी.टी.

0

एक ऐसी समस्या की कल्पना करें, जो ट्रैवलिंग सेल्समैन की तरह बहुत सारी ब्रूट फोर्स द्वारा हल की जा सकती है। फिर कल्पना करें कि आपको प्रत्येक 8 स्पंकी वीडियो कार्ड के साथ सर्वर के रैक मिले हैं, और प्रत्येक कार्ड में 3000 CUDA कोर हैं।

बस सभी संभव विक्रेता के मार्गों को हल करें और फिर समय / दूरी / कुछ मीट्रिक के लिए सॉर्ट करें। सुनिश्चित करें कि आप अपने काम का लगभग 100% फेंक रहे हैं, लेकिन क्रूर बल कभी-कभी एक व्यवहार्य समाधान है।


मेरे पास एक सप्ताह के लिए 4 ऐसे सर्वरों के एक छोटे से खेत तक पहुंच थी, और पांच दिनों में मैंने पिछले 10 वर्षों की तुलना में अधिक वितरित.net ब्लॉक किए।
क्रिगी

-1

कई इंजीनियरिंग विचारों का अध्ययन करने से, मैं कहता हूं कि एक gpu कार्यों का ध्यान केंद्रित करने का एक रूप है, स्मृति-प्रबंधन का, दोहराने योग्य-गणना का।

कई सूत्र लिखने के लिए सरल हो सकते हैं लेकिन गणना करने के लिए दर्दनाक हैं जैसे कि मैट्रिक्स गणित में आपको एक भी उत्तर नहीं मिलता है लेकिन कई मान हैं।

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

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

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

एक gpu गंभीर काम करने वाला है। एक सीपीयू पूर्ण अराजकता का प्रबंधन कर रहा है और हर विवरण को संभाल नहीं सकता है।

तो हम क्या सीखते हैं? एक gpu एक ही बार में थकाऊ काम का विवरण देता है और एक सीपीयू एक बहु-कार्य मशीन है जो बहुत सारे कार्यों के साथ बहुत अच्छी तरह से ध्यान केंद्रित नहीं कर सकता है। (ऐसा लगता है कि यह एक ही समय में ध्यान विकार और आत्मकेंद्रित है)।

इंजीनियरिंग में विचारों, डिजाइन, वास्तविकता और बहुत सारे ग्रंट कार्य हैं।

जैसा कि मैंने सरल शुरू करने के लिए याद किया है, जल्दी से शुरू करो, असफल-जल्दी, असफल-तेजी से, और कोशिश करना कभी न छोड़ें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.