मेरा प्रोग्राम 2 धागे चलाता है - थ्रेड ए (इनपुट के लिए) और बी (प्रसंस्करण के लिए)। मेरे पास 2 बफर के पॉइंटर्स की एक जोड़ी भी है, ताकि जब थ्रेड ए ने बफर 1 में डेटा कॉपी करना समाप्त कर दिया हो, थ्रेड बी बफर 1 को प्रोसेस करना शुरू कर देता है और थ्रेड ए डेटा को बफर 2 में कॉपी करना शुरू करता है। फिर जब बफर 2 भरा होता है, तो थ्रेड ए प्रतियां बफर 1 और थ्रेड बी प्रक्रिया में डेटा बफर 2, और इसी तरह से।cudaMemcpy अमान्य तर्क
मेरी समस्या तब आती है जब मैं cudaMemcpy Buffer [] में d_Buffer (जिसे पहले मुख्य थ्रेड द्वारा cudaMalloc'd था, यानी थ्रेड सृजन से पहले। बफर [] को मुख्य थ्रेड द्वारा भी malloc'd किया गया था)। मुझे एक "अवैध तर्क" त्रुटि मिलती है, लेकिन मुझे पता नहीं है कि अवैध तर्क कौन सा है।
मैंने अपने प्रोग्राम को एक थ्रेडेड प्रोग्राम में कम कर दिया है, लेकिन फिर भी 2 बफर का उपयोग कर रहा हूं। यही है, प्रतिलिपि बनाने और प्रसंस्करण एक के बाद एक दूसरे के बाद होता है। CudaMemcpy लाइन बिल्कुल डबल थ्रेडेड के समान है। सिंगल थ्रेडेड प्रोग्राम ठीक काम करता है।
मुझे यकीन नहीं है कि त्रुटि कहां है।
धन्यवाद।
सादर, Rayne
धन्यवाद! मुझे cuCtxPushCurrent और cuCtxPopCurrent मिला, जो ड्राइवर API हैं। क्या संदर्भ माइग्रेशन के लिए रनटाइम एपीआई हैं? क्या मैं एक ही प्रोग्राम में रनटाइम और ड्राइवर एपीआई मिश्रण कर सकता हूं? – Rayne
कोई रनटाइम एपीआई संदर्भ प्रबंधन दिनचर्या नहीं है, क्योंकि संदर्भ रनटाइम एपीआई में अंतर्निहित/सारणित हैं। हालांकि, चूंकि CUDA 3.1 जारी किया गया था, हां आप रनटाइम और ड्राइवर API को सुरक्षित रूप से कॉल कर सकते हैं। संदर्भ को बनाने और इसे थ्रेड से थ्रेड में माइग्रेट करने के लिए आपको ड्राइवर एपीआई का उपयोग करना सबसे आसान लगेगा, संदर्भ के बाकी हिस्सों के लिए रनटाइम एपीआई का उपयोग करें। सावधान रहें कि संदर्भ माइग्रेशन स्वयं मुक्त नहीं है, यह थोड़ा विलंबता जोड़ता है, लेकिन यह पूर्व-CUDA 4.0 – talonmies
जो आप चाहते हैं वह करने का आधिकारिक तरीका है I CUDA 4.0 को आजमाएं। क्या मैं बस CUDA 3.2 की वर्तमान स्थापना पर CUDA 4.0 स्थापित करता हूं? क्या मुझे कुछ भी हटाने की ज़रूरत है, उदा। ड्राइवर आदि? – Rayne