2009-03-05 11 views
10

डीडीआर 3 दोहरी चैनल मेमोरी के साथ कोर 2 प्रोसेसर के लिए सैद्धांतिक अधिकतम मेमोरी बैंडविड्थ प्रभावशाली है: आर्किटेक्चर पर Wikipedia article के अनुसार, प्रति सेकंड 10+ या 20+ गीगाबाइट्स। हालांकि, स्टॉक memcpy() कॉल इसे प्राप्त नहीं करते हैं। (इस तरह के सिस्टम पर मैंने देखा है कि 3 जीबी/एस है।) संभावना है कि यह ओएस विक्रेता आवश्यकता के कारण है कि प्रोसेसर की विशेषताओं के आधार पर प्रत्येक प्रोसेसर लाइन के लिए memcpy() को ट्यून किया जाए, इसलिए एक स्टॉक memcpy() कार्यान्वयन ब्रांड और लाइनों की एक विस्तृत संख्या पर उचित होना चाहिए।कोर 2 या कोर i7 आर्किटेक्चर के लिए पूरी तरह से अनुकूलित memcpy/memmove?

मेरा प्रश्न: क्या कोर 2 या कोर i7 प्रोसेसर के लिए एक स्वतंत्र रूप से उपलब्ध, अत्यधिक ट्यून संस्करण है जिसे सी प्रोग्राम में उपयोग किया जा सकता है? मुझे यकीन है कि मैं एक की जरूरत में एकमात्र व्यक्ति नहीं हूं, और यह हर किसी के लिए अपने स्वयं के memcpy() को माइक्रो-अनुकूलित करने के लिए प्रयास का एक बड़ा अपशिष्ट होगा।

उत्तर

6

यदि आप निर्दिष्ट करते हैं/ARCH: एसएसई 2 एमएसवीसी के लिए यह आपको एक ट्यूनेड memcpy (कम से कम, मेरा करता है) प्रदान करना चाहिए।

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

आपका सीमित कारक शायद सीपीयू चक्रों की बजाय कैश मिस और दक्षिणब्रिज बैंडविड्थ है। यह देखते हुए कि मेमोरी बस पर हमेशा कई अन्य ट्रैफिक होने जा रहे हैं, मैं आमतौर पर ऐसे परिचालनों में लगभग 9 0% सैद्धांतिक स्मृति बैंडविड्थ थ्रुपुट प्राप्त करने में प्रसन्न हूं।

+1

एमएसवीसी memcpy वेक्टरेटेड है जब इन शर्तों को पूरा किया जाता है (लगभग, मैं इस पर एक विशेषज्ञ नहीं हूँ): स्रोत और dest पते दोनों कम से कम 8-बाइट (64-बिट) गठबंधन हैं, और आंदोलन का आकार ऊपर है एक निश्चित दहलीज। 64-बिट संरेखण एमएसवीसी की गारंटी से आता है कि इसका अपना 'मॉलोक' 64-बिट संरेखण देता है। फिर, 32-बिट बिल्डों पर, 128-बिट एसएसई 2 का उपयोग किया जाएगा (यदि आवश्यक हो तो 64-बिट शफल के साथ), और 64-बिट बिल्ड पर, यह 64-बिट सामान्य प्रयोजन रजिस्टरों (डफ के डिवाइस के साथ) का उपयोग आंदोलन करने के लिए करेगा क्योंकि जब यह ठीक से किया जाता है तो यह एसएसई 2 की तुलना में "तेज़ पर्याप्त" होता है। – rwong

+1

/मेहराब: न्यूनतम CPU वास्तुकला आवश्यकताओं, में से एक: SSE2 - (डिफ़ॉल्ट) SSE2 के साथ उपलब्ध निर्देश का उपयोग सक्षम सक्षम सीपीयू यह वह जगह है दृश्य स्टूडियो vs2013.update3 के कुलपति ++ उत्पादन । जिसमें मेरे बेंचमार्क के आधार पर एसएसई 2 डिफ़ॉल्ट है, उपयोग/आर्क: एसएसई 2 मेम्पी प्रदर्शन में सुधार नहीं करेगा, और मैंने बेंचमार्क किया है, यहां तक ​​कि/ARCH: AVX memcpy प्रदर्शन में सुधार नहीं करता है। – zhaorufei

2

आप अपना खुद का लिख ​​सकते हैं। आर्किटेक्चर को सीधे लक्षित करने के लिए intel optimising compiler का उपयोग करने का प्रयास करें?

इंटेल अनुप्रयोगों को अनुकूलित करने के लिए VTune (कंपाइलर और भाषा स्वतंत्र) नामक कुछ भी उत्पन्न करता है।

यहां एक गेम इंजन को अनुकूलित करने पर article है।

+0

इंटेल का कंपाइलर उसी अनुकूलन स्विच के साथ जीसीसी पर कितना सुधार प्रदान करता है ... say -O3? –

+0

पिछली बार मैंने कोशिश की, लगभग 35%, लेकिन यह कुछ साल पहले था। – Crashworks

+0

डाउनवॉटर कृपया एक टिप्पणी छोड़ देगा। धन्यवाद। –

7

बैंडविड्थ को मापते समय आपने ध्यान में रखा था कि memcpy दोनों एक पढ़ा और लिखना था, इसलिए 3 जीबी की स्मृति प्रतिलिपि वास्तव में 6 जीबी/बैंडविड्थ है?

याद रखें, बैंडविड्थ सैद्धांतिक अधिकतम है - असली दुनिया का उपयोग बहुत कम होगा। उदाहरण के लिए, एक पेज गलती और आपकी बैंडविड्थ एमबी/एस तक गिर जाएगी।

memcpy/memmove कंपाइलर इंट्रिनिक्स हैं और आम तौर पर रेड movsd (या यदि आपके कंपाइलर को लक्षित कर सकते हैं तो उपयुक्त एसएसई निर्देश) के लिए रेखांकित किया जाएगा। इस पर कोडेजन में सुधार करना असंभव हो सकता है, क्योंकि आधुनिक सीपीयू इस तरह के निर्देशों को बहुत अच्छी तरह से संभाल लेगा।

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