2012-09-17 6 views
5

मेरे पास है:बेहतर या वही: सीपीयू memcpy() बनाम डिवाइस cudaMemcpy() पिन पर, cUDA में मैप मेमोरी?

  • होस्ट स्मृति है कि सफलतापूर्वक पिन किए गए और cudaHostAlloc(..., cudaHostAllocMapped) या cudaHostRegister(..., cudaHostRegisterMapped) का उपयोग कर मैप किया;
  • डिवाइस पॉइंटर्स cudaHostGetDevicePointer(...) का उपयोग करके प्राप्त किए गए हैं।

मैं src और गंतव्य डिवाइस संकेत दिए गए कि पिन किए गए + मैप की स्मृति के दो अलग-अलग क्षेत्रों के ऊपर तकनीक के द्वारा प्राप्त को इंगित पर cudaMemcpy(..., cudaMemcpyDeviceToDevice) आरंभ करें। सबकुछ ठीक काम करता है।

प्रश्न: क्या मुझे यह करना जारी रखना चाहिए या पारंपरिक सीपीयू-शैली memcpy() का उपयोग करना चाहिए क्योंकि सब कुछ सिस्टम मेमोरी में है? ... या वे समान (यानी cudaMemcpy सीधे memcpy पर नक्शा हैं जब दोनों स्रोत और dest पिन पिन किए जाते हैं)?

(मैं अभी भी cudaMemcpy विधि का उपयोग कर रहा है, क्योंकि पहले से सब कुछ उपकरण वैश्विक स्मृति में किया गया था, लेकिन जब से gmem आकार की कमी के कारण पिन किए गए स्मृति में बदला गया है) (

+1

यह एक दिलचस्प सवाल है। बशर्ते आप एक अनुकूलित memcpy का उपयोग करें, सीपीयू शायद बेहतर है - स्मृति इसके बाद से संबंधित है - और मेजबान करने के लिए एक अलग GPU की क्षमता-> मेजबान memcpy पीसीआई बैंडविड्थ तक ही सीमित है। लेकिन अगर जीपीयू अन्यथा निष्क्रिय होगा, तो क्यों नहीं? – ArchaeaSoftware

+0

मुझे उम्मीद है कि जीपीयू प्रतिलिपि नहीं करेगा। मुझे उम्मीद है कि रनटाइम यह देखेगा कि पॉइंटर्स मेजबान पॉइंटर्स दोनों हैं और मेजबान memcpy का आह्वान करते हैं। मैंने यह जानने के लिए कहा है कि वास्तव में क्या होता है। – harrism

उत्तर

3

cudaMemcpy के साथ CUDA ड्राइवर का पता लगाता है कि आप एक होस्ट पॉइंटर से होस्ट पॉइंटर पर प्रतिलिपि बना रहे हैं और कॉपी सीपीयू पर की जाती है। यदि आप चाहें तो आप निश्चित रूप से सीपीयू पर memcpy का उपयोग कर सकते हैं।

यदि आप cudaMemcpy का उपयोग करते हैं, तो कॉपी करने से पहले एक अतिरिक्त स्ट्रीम सिंक्रनाइज़ किया जा सकता है (जिसे आप प्रोफाइलर में देख सकते हैं, लेकिन मैं अनुमान लगा रहा हूं कि — परीक्षण और देखें)।

एक यूवीए सिस्टम पर आप केवल cudaMemcpyDefault का उपयोग कर सकते हैं क्योंकि उनके जवाब में तालनी कहते हैं। लेकिन अगर आपके पास यूवीए (sm_20 + और 64-बिट ओएस) नहीं है, तो आपको सही प्रतिलिपि (उदा। cudaMemcpyDeviceToDevice) कॉल करना होगा। यदि आप cudaHostRegister() सब कुछ आप तो cudaMemcpyDeviceToDevice में रुचि निम्नलिखित पर निर्भर करता है, जहां स्मृति स्थित है कर खत्म हो जाएगा रहे हैं:

  • होस्ट < -> होस्ट: (memcpy) सीपीयू द्वारा किया जाता
  • होस्ट < - > उपकरण: डीएमए (डिवाइस से कॉपी इंजन)
  • डिवाइस < -> उपकरण: memcpy CUDA कर्नेल (रन एसएमएस पर, चालक द्वारा शुरू की)
+0

के साथ डिवाइस कॉपी में डिवाइस बहुत रुचि होगी, क्या आपके पास कुछ स्रोत है जहां आपको इन्फोस मिला है? –

+0

मेरा मानना ​​है कि मैंने कार्यान्वयन के विवरण के लिए अपने एनवीआईडीआईए सहयोगियों से पूछा। – harrism

2

आप यूवीए के साथ एक मंच पर काम कर रहे हैं एकीकृत वर्चुअल एड्रेसिंग), मैं cudaMemcpycudaMemcpyDefault के साथ दृढ़ता से सुझाव देना चाहता हूं। इस तरह से सबसे तेज़ पथ के बारे में यह सब एक आंतरिक एपीआई कार्यान्वयन विवरण बन जाता है जिसके बारे में आपको चिंता करने की ज़रूरत नहीं है।

+0

हां और नहीं, मैं अक्सर सी 1060 पर काम करता हूं, लेकिन सी 2050/70 के लिए उपयोग करता हूं। तो मेरे पिन किए गए मेमोरी प्रश्न के संबंध में विशेष रूप से क्या - क्या आपको पता है कि इस मामले में दृश्यों के पीछे 'cudaMemcpyDefault' क्या करता है?वह सवाल का जवाब बहुत अधिक होगा। – schmichael

+0

मैं काम नहीं करता हूं। एनवीआईडीआईए के लिए इसलिए मैंने कोई कोड नहीं देखा है, लेकिन यह स्रोत और गंतव्य पॉइंटर्स को देखता है और तदनुसार। आपको मेजबान पॉइंटर के साथ एक मेजबान साइड कॉपी मिल जाएगी और डिवाइस पॉइंटर – talonmies

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