2012-02-20 14 views
8

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

यह मेरी पहली बार एक जटिल जटिलता की सी परियोजना को बदलने की कोशिश कर रहा है जिसमें एक .configure और Makefile शामिल है। ईमानदारी से, यह पहली बार सी में कुछ भी कर रहा है, जिसमें जीसीसी या जी ++ शामिल है, इसलिए मैं बहुत खो गया हूं।

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

इसके साथ, इस परियोजना के निर्माण के लिए मेरे विकल्प क्या हैं? मैं सवाल के असंख्य है ...

  • मैं AC_PROG_CC के बाद configure.in फ़ाइल को जोड़ने "सीसी = NVCC" की कोशिश की। यह काम पर दिखाई दिया - कॉन्फ़िगरेशन से आउटपुट आउटपुट और एनवीसीसी को कंपाइलर के रूप में दिखाया गया। हालांकि सीयूडीए कर्नेल के साथ स्रोत फ़ाइल को संकलित करने में असफल रहा, सीयूडीए विशिष्ट वाक्यविन्यास को मान्यता नहीं दे रहा है। मुझे नहीं पता क्यों, उम्मीद कर रहा था कि यह सिर्फ काम करेगा।

  • क्या एनवीसीसी के साथ एक स्रोत फ़ाइल संकलित करना संभव है, और फिर इसे मुख्य कार्यक्रम के लिए प्रक्रिया प्रक्रिया में जोड़ने के चरण में शामिल करना संभव है? यदि हां, तो कैसे? (यह प्रश्न समझ में नहीं आता है - मैं वास्तव में इस पर जंगली हूं)

  • ऐसा करने का सही तरीका क्या है?

  • क्या परीक्षण के उद्देश्यों के लिए मैं एक त्वरित और गंदा तरीका उपयोग कर सकता हूं?

  • क्या कोई गुप्त उपकरण है जो हर कोई इन कॉन्फ़िगरेशन और मेकफ़ाइल को सेटअप और समझने के लिए उपयोग करता है? यह अपाचे चींटी स्क्रिप्ट मैं करने के लिए इस्तेमाल कर रहा हूँ से भी बदतर है (हाँ, मैं अपने दायरे से बाहर कर रहा हूँ)

+2

जो चीज आपने याद की हो वह फ़ाइल एक्सटेंशन है। एनवीसीसी फाइल एक्सटेंशन का उपयोग करता है जिसमें डिवाइस कोड शामिल है और क्या नहीं है - फाइलों वाले किसी भी डिवाइस कोड में सही ढंग से संकलित करने के लिए '.cu' एक्सटेंशन होना चाहिए। – talonmies

+0

बस उत्सुक, आप CUDA फ़ंक्शन में क्या कर रहे हैं? – arrayfire

+0

.cu फ़ाइलों के बारे में अच्छी बात। मैं कुछ स्रोत फ़ाइलों का नाम बदलने की कोशिश करूंगा। – emulcahy

उत्तर

14

आप NVCC के साथ सब कुछ संकलन करने की जरूरत नहीं है। आपका अनुमान है कि आप अपने सीयूडीए कोड को एनवीसीसी के साथ संकलित कर सकते हैं और बाकी सब कुछ छोड़ सकते हैं (लिंकिंग को छोड़कर) सही है। यहां दृष्टिकोण है जिसका उपयोग मैं शुरू करने के लिए करूंगा।

  1. एक 1 नया हैडर (जैसे myCudaImplementation.h) और 1 नया स्रोत फ़ाइल (.cu विस्तार के साथ, उदा myCudaImplementation.cu) जोड़ें। स्रोत फ़ाइल में आपके कर्नेल कार्यान्वयन के साथ-साथ ए (होस्ट) सी रैपर फ़ंक्शन शामिल है जो उचित निष्पादन कॉन्फ़िगरेशन (उर्फ <<<>>>) और तर्कों के साथ कर्नेल को आमंत्रित करता है। हेडर फ़ाइल में सी रैपर फ़ंक्शन के लिए प्रोटोटाइप होता है। उस आवरण समारोह runCudaImplementation()

  2. मैं भी स्रोत फ़ाइल (शीर्षक में प्रोटोटाइप के साथ) में एक और मेजबान सी समारोह प्रदान करेगा कि प्रश्नों और GPU उपकरणों कॉन्फ़िगर करता है वर्तमान और सच रिटर्न अगर यह सफल होता है, नहीं तो झूठी कहते हैं। आइए इस फ़ंक्शन को configureCudaDevice() पर कॉल करें।

  3. अब आपके मूल सी कोड में, जहां आप आमतौर पर अपने सीपीयू कार्यान्वयन को कॉल करेंगे, आप यह कर सकते हैं।

    // must include your new header 
    #include "myCudaImplementation.h" 
    
    // at app initialization 
    // store this variable somewhere you can access it later 
    bool deviceConfigured = configureCudaDevice;   
    ...        
    // then later, at run time 
    if (deviceConfigured) 
        runCudaImplementation(); 
    else 
        runCpuImplementation(); // run the original code 
    
  4. अब, जब से तुम एक नया .cu फ़ाइल में अपने सभी CUDA कोड डाल, आप केवल NVCC साथ उस फ़ाइल को संकलित करने के लिए है। बाकी सब कुछ वही रहता है, सिवाय इसके कि आपको ऑब्जेक्ट फ़ाइल में लिंक करना होगा जो एनवीसीसी आउटपुट करता है। जैसे

    nvcc -c -o myCudaImplementation.o myCudaImplementation.cu <other necessary arguments> 
    

फिर अपने लिंक लाइन के लिए myCudaImplementation.o जोड़ने (:) जी ++ -ओ MyApp myCudaImplementation.o

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

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

+0

ग्रेट, इसे समझाने के लिए समय निकालने के लिए धन्यवाद। मैं उस दृष्टिकोण को संभाल सकता हूं। – emulcahy

+0

यह काम कर रहा है। दूसरों को एक अतिरिक्त कदम करने की आवश्यकता हो सकती है जो रैपर विधि के आस-पास बाहरी "सी" {} जोड़ती है। हालांकि, यह शायद दिग्गजों को जोड़ने के लिए स्पष्ट है। – emulcahy

+1

आपको बाहरी "सी" का उपयोग नहीं करना चाहिए जबतक कि आपके पास केवल सी लिंकेज नहीं है (उदा। इसे एक .c फ़ाइल से कॉल करना)। – harrism

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