2011-04-11 14 views
6

मेरा प्रोग्राम 2 धागे चलाता है - थ्रेड ए (इनपुट के लिए) और बी (प्रसंस्करण के लिए)। मेरे पास 2 बफर के पॉइंटर्स की एक जोड़ी भी है, ताकि जब थ्रेड ए ने बफर 1 में डेटा कॉपी करना समाप्त कर दिया हो, थ्रेड बी बफर 1 को प्रोसेस करना शुरू कर देता है और थ्रेड ए डेटा को बफर 2 में कॉपी करना शुरू करता है। फिर जब बफर 2 भरा होता है, तो थ्रेड ए प्रतियां बफर 1 और थ्रेड बी प्रक्रिया में डेटा बफर 2, और इसी तरह से।cudaMemcpy अमान्य तर्क

मेरी समस्या तब आती है जब मैं cudaMemcpy Buffer [] में d_Buffer (जिसे पहले मुख्य थ्रेड द्वारा cudaMalloc'd था, यानी थ्रेड सृजन से पहले। बफर [] को मुख्य थ्रेड द्वारा भी malloc'd किया गया था)। मुझे एक "अवैध तर्क" त्रुटि मिलती है, लेकिन मुझे पता नहीं है कि अवैध तर्क कौन सा है।

मैंने अपने प्रोग्राम को एक थ्रेडेड प्रोग्राम में कम कर दिया है, लेकिन फिर भी 2 बफर का उपयोग कर रहा हूं। यही है, प्रतिलिपि बनाने और प्रसंस्करण एक के बाद एक दूसरे के बाद होता है। CudaMemcpy लाइन बिल्कुल डबल थ्रेडेड के समान है। सिंगल थ्रेडेड प्रोग्राम ठीक काम करता है।

मुझे यकीन नहीं है कि त्रुटि कहां है।

धन्यवाद।

सादर, Rayne

उत्तर

5

आप CUDA 3.2 के साथ यह कर रहे हैं या इससे पहले, कारण यह है कि GPU संदर्भों एक विशिष्ट थ्रेड से बंधा रहे हैं है। यदि एक बहु थ्रेडेड प्रोग्राम ने अलग-अलग मेजबान धागे से एक ही जीपीयू पर स्मृति आवंटित की है, आवंटन अलग-अलग संदर्भ स्थापित करने में हवाला देते हैं, और एक संदर्भ से पॉइंटर्स किसी अन्य संदर्भ में पोर्टेबल नहीं हैं। प्रत्येक संदर्भ के साथ काम करने के लिए अपनी "वर्चुअलाइज्ड" मेमोरी स्पेस है।

समाधान या तो संदर्भ माइग्रेशन एपीआई का उपयोग किसी भी संदर्भ को धागे से धागे से स्थानांतरित करने के लिए करने के लिए किया जाता है, या नए सार्वजनिक CUDA 4.0rc2 रिलीज़ को आज़माएं, जिसे आप उपयोग के बिना जो करने का प्रयास कर रहे हैं उसका समर्थन करना चाहिए संदर्भ प्रवासन का। नकारात्मकता यह है कि 4.0 आरसी 2 एक परीक्षण रिलीज है, और इसके लिए एक विशेष बीटा रिलीज ड्राइवर की आवश्यकता है। वह चालक काम नहीं करेगा सभी हार्डवेयर (उदाहरण के लिए लैपटॉप)।

+0

धन्यवाद! मुझे cuCtxPushCurrent और cuCtxPopCurrent मिला, जो ड्राइवर API हैं। क्या संदर्भ माइग्रेशन के लिए रनटाइम एपीआई हैं? क्या मैं एक ही प्रोग्राम में रनटाइम और ड्राइवर एपीआई मिश्रण कर सकता हूं? – Rayne

+0

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

+0

जो आप चाहते हैं वह करने का आधिकारिक तरीका है I CUDA 4.0 को आजमाएं। क्या मैं बस CUDA 3.2 की वर्तमान स्थापना पर CUDA 4.0 स्थापित करता हूं? क्या मुझे कुछ भी हटाने की ज़रूरत है, उदा। ड्राइवर आदि? – Rayne

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