CUDA मेमोरी को इतनी तेज़ी से पिन क्यों किया जाता है?


84

जब मैं CUDA डेटा ट्रांसफ़र के लिए पिन किए गए मेमोरी का उपयोग करता हूं, तो डेटा ट्रांसफर में पर्याप्त स्पीडअप का निरीक्षण करता हूं। Linux पर, इसे प्राप्त करने के लिए अंतर्निहित सिस्टम कॉल mlock है। प्लॉक के मैन पेज से, यह कहा गया है कि पेज को लॉक करने से इसे स्वैप होने से रोकता है:

आलिंगन शुरू करने और लेन बाइट्स के लिए जारी रखने की सीमा में mlock () पेजों को लॉक करता है। सभी पृष्ठ जिनमें निर्दिष्ट पता सीमा का एक हिस्सा होता है, कॉल के सफलतापूर्वक वापस आने पर RAM में निवासी होने की गारंटी दी जाती है;

मेरे परीक्षणों में, मैंने अपने सिस्टम पर मुफ्त मेमोरी के कुछ गिग्स लिए थे, इसलिए कभी कोई जोखिम नहीं था कि मेमोरी पेजों की अदला-बदली हो सकती थी फिर भी मैंने स्पीडअप का अवलोकन किया। क्या कोई समझा सकता है कि वास्तव में यहाँ क्या हो रहा है ?, किसी भी जानकारी या जानकारी की बहुत सराहना की जाती है।


क्या आपने खुद ही समय का मापन किया?
अगस्त

नहीं, झुंड कॉल को निष्पादित करने के लिए लिया गया वास्तविक समय नगण्य माना जाता है (यदि आप जो पूछ रहे हैं)। वास्तविक ओवरहेड वास्तविक डेटा स्थानांतरण है, जो मेरे एल्गोरिथ्म में कुल चक्र समय का एक महत्वपूर्ण अंश है।
गायरॉइड मर्फी

आपका CPU क्या है? हो सकता है, NUMA- सक्षम नोड्स को सरल से लाभ नहीं होगा mlock()
22

एएमडी फेनोम (टीएम) II X4 970 प्रोसेसर
गीयरॉइड मर्फी

जवाबों:


85

CUDA ड्राइवर चेक करता है , यदि मेमोरी रेंज लॉक है या नहीं और फिर यह एक अलग कोडपैथ का उपयोग करेगा। लॉक की गई मेमोरी को भौतिक मेमोरी (RAM) में संग्रहीत किया जाता है, इसलिए डिवाइस CPU / DMA, aka Async कॉपी से w / o मदद प्राप्त कर सकता है; डिवाइस को केवल भौतिक पृष्ठों की सूची की आवश्यकता है)। नॉन-लॉक की गई मेमोरी एक्सेस पर एक पेज फॉल्ट उत्पन्न कर सकती है, और इसे न केवल मेमोरी में स्टोर किया जाता है (जैसे कि यह स्वैप में हो सकता है), इसलिए ड्राइवर को नॉन-लॉक्ड मेमोरी के हर पेज को एक्सेस करने की आवश्यकता होती है, इसे पिन किए गए बफर में कॉपी करें और इसे पास करें डीएमए (सिंक्रोनस, पृष्ठ-दर-पृष्ठ कॉपी)।

जैसा कि यहां बताया गया है http://forums.nvidia.com/index.php?showtopic=164661

अतुल्यकालिक मेम कॉपी कॉल द्वारा उपयोग की जाने वाली होस्ट मेमोरी को cudaMallocHost या cudaHostboc के माध्यम से लॉक करने की आवश्यकता होती है।

मैं developer.download.nvidia.com पर cudaMemcpyAsync और cudaHostAlloc मैनुअल की जांच करने की भी सिफारिश कर सकता हूं। HostAlloc का कहना है कि cuda ड्राइवर पिन की गई मेमोरी का पता लगा सकता है:

चालक इस (cudaHostAlloc) फ़ंक्शन के साथ आवंटित वर्चुअल मेमोरी रेंज को ट्रैक करता है और स्वचालित रूप से cudaMemcpy () जैसे फ़ंक्शन को कॉल को तेज करता है।


1
मुझे आश्चर्य है कि एसिंक्रोनस कॉपी कमांड जारी करने के बाद आप एक और धागा बनाने के लिए कितना हॉक कर सकते हैं?
ज़ैन लिंक्स

1
ज़ैन लिंक्स, दिलचस्प सवाल। आप इस मेमोरी को अनलॉक क्यों करना चाहते हैं? 32-बिट पीसी पर भी 2-4 जीबी तक मेमोरी लॉक हो सकती है, और जब पीसीआई-एक्सप्रेस कार्ड की पहुंच 64-बिट (वास्तविक 40 या 48 बिट) में होती है। यह अधिक मेमोरी खरीदने के लिए बहुत अधिक सस्ता है, फिर अत्यधिक समाप्ति (18k प्रतिनिधि पर! एसओ) प्रोग्रामर के लिए भुगतान करने के लिए। जैसा कि लिनक्स में मुझे लगता है (विश्वास है), मनलॉक अवरुद्ध हो जाएगा या त्रुटि वापस कर देगा, और सिस्टम को कोई नुकसान नहीं पहुंचाया जाएगा।
23

क्या मैं cudaHostRegisterमेमोरी मैप की गई फ़ाइल के लिए पॉइंटर पर आवेदन कर सकता हूं ?
टोमिलोव अनातोली

16

CUDA पिन की गई मेमोरी को GPU में ट्रांसफर करने के लिए DMA का उपयोग करता है। PAGeable होस्ट मेमोरी का उपयोग DMA के साथ नहीं किया जा सकता क्योंकि वे डिस्क पर रहते हैं। यदि मेमोरी को पिन नहीं किया गया है (यानी पेज-लॉक), तो इसे पहले एक पेज-लॉक "स्टेजिंग" बफर में कॉपी किया जाता है और फिर डीएमए के माध्यम से जीपीयू में कॉपी किया जाता है। तो पिन की गई मेमोरी का उपयोग करके आप पेज-लॉक होस्ट मेमोरी में पेज करने योग्य होस्ट मेमोरी से कॉपी करने का समय बचाते हैं।


5

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


मुझे लगता है कि यह कोई मामला नहीं है (मैं अपने जवाब के शुरुआती संस्करण में इसके बारे में लिखता हूं), क्योंकि यह एक वास्तविक कार्यक्रम है और कार्यक्रम mlock()में तेज था (टिप्पणी # 2 से क्यू पर जांच करें)।
22x पर ऑक्सक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.