2009-06-03 13 views
10

मुझे सी ++ या असेंबली भाषा में, संभवतः एकल प्रयास में मेमोरी के ब्लॉक को प्रतिलिपि बनाने के तरीके पर एक सुझाव की आवश्यकता है।मेमोरी की प्रतिलिपि ब्लॉक

मेरे पास स्मृति स्थान और ऑफ़सेट के लिए एक सूचक है। स्मृति को 2 डी सरणी के रूप में सोचें जिसे मुझे पंक्तियों और स्तंभों की प्रतिलिपि बनाने की आवश्यकता है।

उत्तर

4

आप इस तरह की कार्यक्षमता खुद को लागू करने की जरूरत है, मैं अगर यह कुशलता से किया जा सकता है आप Duff's Device की जांच करने का सुझाव देते हैं।

+0

अच्छी तरह से मैंने आपके उत्तर में मुझे कुछ मिलीसेकंड बचाने में मदद की। –

38

कैसे std::memcpy के बारे में?    

+0

हां, memcpy का उपयोग करें, क्योंकि यह आमतौर पर लक्ष्य आर्किटेक्चर के लिए इष्टतम है। X86 आर्किटेक्चर पर, इष्टतम कार्यान्वयन कुछ 128-बिट एसएसई रजिस्टरों का उपयोग करते हैं। –

+0

अच्छी तरह से मैंने पहले ही कोशिश की थी। क्या memcopy करता है कि यह एक समय में एक पंक्ति की प्रतिलिपि बनाता है। मुझे लगता है कि मेरे पास 5000 पंक्तियों या उससे अधिक की एक ब्लॉक है और एक समारोह में जिसे 10000 बार हर समय कहा जाता है। –

+2

यदि सभी पंक्तियां स्मृति में संगत हैं, तो आप एक ही memcpy कॉल में सभी पंक्तियों की प्रतिलिपि बना सकते हैं। यदि स्मृति में पंक्तियों के बीच अंतराल छोटे होते हैं, तो एक भी memcpy कॉल शायद सबसे तेज़ तरीका होगा। यदि सभी पंक्तियों को अलग से आवंटित किया जाता है, तो memcpy का एक लूप की आवश्यकता होगी। –

2

अपनी टिप्पणियां पढ़ना, ऐसा लगता है जैसे आप समांतरता का उपयोग करना चाहेंगे। ऐसा करने के लिए निर्देश हैं, लेकिन वे केवल रजिस्टरों पर काम करते हैं, स्मृति नहीं।

इसका कारण यह है जिस तरह से कंप्यूटर वास्तुकला है (मैं 86 संभालने हूँ) की है।

आप केवल एक समय में एक स्मृति स्थान ऐक्सेस कर सकते हैं, क्योंकि कंप्यूटर केवल एक ही पते के बस है। यदि आपने एक समय में एक से अधिक स्थानों तक पहुंचने का प्रयास किया है, तो आप बस को ओवरलोड कर देंगे और कुछ भी ठीक से काम नहीं करेगा।

यदि आप स्वयं द्वारा रजिस्टर में की जरूरत है डाल सकते हैं, तो आप इस तरह के MMX या SSE के रूप में शांत प्रोसेसर निर्देश, का एक बहुत उपयोग कर सकते हैं, समानांतर गणना करने के लिए। लेकिन समानांतर में स्मृति की प्रतिलिपि बनाने के लिए, यह संभव नहीं है।

जैसा कि अन्य ने कहा है, memcpy का उपयोग करें। यह भरोसेमंद, डीबग और तेज है।

0

असेंबली में आरईपी MOVSD शायद? आप जो भी कॉपी करने की कोशिश कर रहे हैं उस पर अधिक जानकारी के बिना कहना मुश्किल है ... या, आप इसे करने के लिए डीएमए नियंत्रक को पुन: प्रोग्राम कर सकते हैं, लेकिन यह वास्तव में प्रोसेसर का उपयोग करने से धीमा होने वाला होगा। :-)

1

उपयोग memmove() करता है, तो मूल और स्रोत ओवरलैप। आम तौर पर memcpy() और memmove() को आपके कंपाइलर के क्लाइब के लिए पहले ही अनुकूलित किया गया है। यदि आप प्रतिस्थापन लिखते हैं, तो यह सुनिश्चित करने के लिए कि आप अपना कोड धीमा नहीं कर रहे हैं, कम से कम क्लाइब संस्करणों के खिलाफ इसे बेंचमार्क करें।

मैं हर समय 10000 बार

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

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