2011-10-01 13 views
14

मैंने कुछ परियोजनाओं पर ओपनसीएल के साथ काम किया है, लेकिन हमेशा कर्नेल को एक (कभी-कभी बड़ा) फ़ंक्शन के रूप में लिखा है। अब मैं एक और जटिल परियोजना पर काम कर रहा हूं और कई कर्नेल में कार्यों को साझा करना चाहता हूं।बड़े ओपनसीएल कर्नेल का निर्माण कैसे करें?

लेकिन उदाहरण मैं सभी पा सकते हैं एक एकल फाइल (बहुत कुछ भी माध्यमिक कार्य कहते हैं) के रूप में गिरी दिखा। ऐसा लगता है कि एकाधिक फ़ाइलों का उपयोग करना संभव होना चाहिए - clCreateProgramWithSource() एकाधिक स्ट्रिंग स्वीकार करता है (और उन्हें जोड़ता है, मुझे लगता है) - हालांकि pyopencl का Program() केवल एक ही स्रोत लेता है।

तो मैं अनुभव ऐसा करने वाले किसी भी व्यक्ति से सुनना पसंद करेंगे:

  • वहाँ कई स्रोत फ़ाइलों के साथ जुड़े किसी भी समस्याओं कर रहे हैं?
  • फाइलों को बस संयोजित करने के लिए पाइपोप्लेक्ल के लिए सबसे अच्छा कामकाज है?
  • क्या कार्यों की एक लाइब्रेरी संकलित करने के लिए कोई तरीका है (प्रत्येक कर्नेल के साथ लाइब्रेरी स्रोत में गुजरने के बजाय, भले ही सभी का उपयोग नहीं किया जाता है)?
  • यदि हर बार लाइब्रेरी स्रोत में पास करना आवश्यक है, तो अप्रयुक्त कार्यों को छोड़ दिया जाता है (कोई ओवरहेड नहीं)?
  • कोई अन्य सर्वोत्तम अभ्यास/सुझाव?

धन्यवाद।

+2

आप एक संयोजन #include "part1.cl" #include "part2.cl" होने फ़ाइल बना सकते हैं। यह मेरे लिए काम करता है (एनवीडिया कंपाइलर), हालांकि ऐप चलाने पर हर बार संकलित किया जाता है। मुझे लगता है कि प्रीकंपिल्ड फ़ंक्शंस की लाइब्रेरी होने पर थोड़ा सा विज्ञान-फाई होता है, क्योंकि फ़ंक्शन कोड प्रत्येक कर्नेल में रेखांकित किया जाता है (यही कारण है कि आप रिकर्सिव फ़ंक्शन नहीं लिख सकते हैं)। –

उत्तर

6

मुझे नहीं लगता कि OpenCL एक कार्यक्रम में एक से अधिक स्रोत फ़ाइलों की एक अवधारणा है है - एक कार्यक्रम एक संकलन इकाई है। हालांकि, आप कंपाइल समय पर # शामिल और हेडर या अन्य .cl फ़ाइलों में खींच सकते हैं।

आप एक OpenCL कार्यक्रम में कई कर्नेल हो सकता है - हां, तो एक संकलन के बाद, आप संकलित कर्नेल के सेट में से किसी आह्वान कर सकते हैं। या काम करता है, कुछ भी स्थिर नहीं पहुंचा जा सकता होने के लिए जाना जाता है - -

कोई इस्तेमाल नहीं किया कोड समय संकलित करने के लिए, संकलन के दौरान समाप्त हो कुछ मामूली कीमत पर माना जा सकता है।

+0

धन्यवाद। यह वही है जो मैं कर रहा हूं। लेकिन, निराशाजनक रूप से, pyopencl कर्नेल को कैश करते समय # अंतर्निहित सामग्री को ध्यान में रखता नहीं है। इसलिए "लाइब्रेरी" फ़ाइलों को बदलना कैश को मैन्युअल रूप से हटाए बिना संकलित कर्नेल को प्रभावित नहीं करता है। वैसे भी, मैं यह देखने के लिए इंतजार करूंगा कि किसी को आपको सर्वश्रेष्ठ (और केवल!) चिह्नित करने से पहले बेहतर विचार है या नहीं। खुश होती है। –

+0

यदि यह सच है, तो clCreateProgramWithSource का सिंटैक्स काफी अजीब है, है ना? यह स्पष्ट रूप से कई तारों और उन तारों की लंबाई की आवश्यकता है। मुझे यकीन नहीं है कि यह वास्तव में काम करता है (मैं इसे काम करने की कोशिश कर रहा हूं) लेकिन यह अजीब लगता है कि यह वाक्यविन्यास दिए बिना काम नहीं कर सकता ... – user1111929

5

OpenCL 1.2 में आप एक साथ विभिन्न वस्तु फ़ाइलों लिंक।

+0

धन्यवाद; जब मैं शीर्ष ओपनक्ल काम वापस प्राप्त करता हूं तो यह कोशिश करेगा। –

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