2012-03-30 10 views
12

जैसा कि निम्न त्रुटि का तात्पर्य है, कर्नेल में होस्ट फ़ंक्शन ('रैंड') को कॉल करने की अनुमति नहीं है, और मुझे आश्चर्य है कि अगर ऐसा करने की आवश्यकता है तो इसके लिए कोई समाधान है या नहीं।एक CUDA कर्नेल में होस्ट फ़ंक्शन को कैसे कॉल करें?

error: calling a host function("rand") from a __device__/__global__ function("xS_v1_cuda") is not allowed 

उत्तर

26

दुर्भाग्य से आपको लगता है कि __device__ संशोधक के साथ निर्दिष्ट नहीं हैं डिवाइस में कार्यों फोन नहीं कर सकते हैं। आप में CUDA यादृच्छिक जनरेटर पर डिवाइस कोड नज़र curand यादृच्छिक संख्या में की जरूरत हैhttp://developer.nvidia.com/curand

आप अपने खुद के मेजबान समारोह है कि आप उस पर दोनों __host__ और __device__ संशोधक कर्नेल उपयोग से कॉल करना चाहते हैं:

__host__ __device__ int add(int a, int b) 
{ 
    return a + b; 
} 

जब यह फ़ाइल एनवीसीसी कंपाइलर ड्राइवर द्वारा संकलित की जाती है, तो फ़ंक्शंस के दो संस्करण संकलित किए जाते हैं: होस्ट कोड द्वारा कॉल करने योग्य और डिवाइस कोड द्वारा अन्य कॉल करने योग्य। और यही कारण है कि इस समारोह को अब मेजबान और डिवाइस कोड दोनों कहा जा सकता है।

+1

एक cuda का उपयोग करने के बजाय होस्ट फ़ंक्शन को कॉल करने में प्रदर्शन डाउनग्रेड कितना खराब है? – Mattia

+0

क्या इसका मतलब यह है कि मेजबान और डिवाइस केवल कार्यों की अपनी संबंधित प्रतियां निष्पादित करेगा? – avgvstvs

5

जबकि 'रैंड()' लेकिन जैसे "printf" कुछ मेजबान कार्यों के लिए लागू नहीं है जब गणना संगतता के साथ संकलन उपलब्ध हैं> = 2.0

जैसे:

nvcc.exe -gencode=arch=compute_10,code=\sm_10,compute_10\... 
error : calling a host function("printf") from a __device__/__global__ function("myKernel") is not allowed 

संकलित करता है तथा sm_20 साथ काम करता है , compute_20

7

संक्षिप्त उत्तर है कि यहाँ है कि इस मुद्दे को कोई समाधान नहीं है।

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

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

एक बात मैं लगातार आश्चर्यचकित हूं कि कितने प्रोग्रामर मानते हैं कि मानक उच्च गुणवत्ता वाले छद्म-यादृच्छिक संख्या जेनरेटर कैसे मानते हैं। "अपना खुद का रोलिंग" वास्तव में एक अच्छा विचार नहीं है कि एक कला छद्म-यादृच्छिक संख्या कितनी है। स्वीकार्य अप्रत्याशित नंबर प्रदान एक जनरेटर सत्यापित किया जा रहा काम और शैक्षिक प्रतिभा का एक बहुत लेता है ...

-1

मैं निम्नलिखित अर्थ में अन्य उत्तर से कुछ के साथ सहमत नहीं है: एक समस्या का वर्णन नहीं करता

ओपी : यह दुर्भाग्यपूर्ण नहीं है कि आप डिवाइस कोड से __host__ फ़ंक्शंस को कॉल नहीं कर सकते - यह किसी अन्य तरीके से होने के लिए पूरी तरह असंभव है, और यह एक बुरी बात नहीं है।

व्याख्या करने के लिए: मेजबान के बारे में सोचो (CPU) की सीडी है जो आप एक सीडी प्लेयर में डाल की तरह कोड; और डिवाइस कोड जैसे, कहें, एसडी कार्ड जिसे आपने एक लघु संगीत प्लेयर में रखा है।ओपी का सवाल है "मैं अपने लघु संगीत प्लेयर में डिस्क कैसे लगा सकता हूं"? आप नहीं कर सकते, और यह समझना कोई मतलब नहीं है। यह अनिवार्य रूप से वही संगीत हो सकता है (समान कार्यक्षमता वाला कोड; हालांकि आमतौर पर, होस्ट कोड और डिवाइस कोड एक ही कम्प्यूटेशनल कार्य नहीं करते हैं) - लेकिन मीडिया एक दूसरे के लिए परिवर्तनीय नहीं हैं।

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