2012-02-17 10 views
8

मैं ओपनसीएल में एक एल्गोरिदम लिख रहा हूं जिसमें मुझे डेटा के एक उचित भाग को याद रखने के लिए प्रत्येक कार्य इकाई की आवश्यकता होगी, long[70] और long[200] या प्रति कर्नेल के बीच कुछ कहें।एएमडी उपकरणों पर भौतिक स्मृति: स्थानीय बनाम निजी

हालिया एएमडी उपकरणों में 32 कीबी __local मेमोरी है, जो (प्रति कर्नेल डेटा की दी गई मात्रा के लिए) 20-58 कार्य इकाइयों की जानकारी संग्रहीत करने के लिए पर्याप्त है। हालांकि, मैं आर्किटेक्चर से (और विशेष रूप से this drawing से) समझता हूं, प्रत्येक शेडर कोर में भी समर्पित स्मृति की एक समर्पित राशि होती है। हालांकि मैं इसका आकार ढूंढने में असफल रहा।

किसी को भी मुझे बता सकते हैं कैसे कितना निजी स्मृति प्रत्येक गिरी है पता लगाने के लिए?

मैं के बाद से मैं इनमें से कुछ जल्दी ही खरीदने की योजना, HD7970 के बारे में विशेष रूप से उत्सुक हूँ।

संपादित करें: हल समस्या, जवाब परिशिष्ट डी

+2

मैं नहीं मानता कि निजी स्मृति कोर प्रति समर्पित है - यह रजिस्टर फ़ाइल है, जो प्रति गणना इकाई संसाधन है करने के लिए मैप करता है। प्रत्येक कार्य आइटम को गणना इकाई रजिस्टर फ़ाइल से आवंटित रजिस्ट्रार प्राप्त होते हैं, कितने आवश्यक हैं किसी भी तत्काल तत्काल उड़ान में तरंगों की संख्या निर्धारित करता है। – talonmies

+0

मशहूर हर जगह देखे गए चित्र से http://www.codeproject.com/KB/showcase/Memory-Spaces/image001.jpg मैंने निष्कर्ष निकाला कि निजी स्मृति __local स्मृति से भौतिक रूप से अलग है, नहीं? – user1111929

+2

हां, वे शारीरिक रूप से अलग हैं। अधिकांश आधुनिक एएमडी उपकरणों में इकाई स्तर साझा स्मृति की गणना करने के लिए गणना स्मृति इकाई फ़ाइल, स्थानीय मेमोरी के लिए निजी मेमोरी मैप्स। कुछ शुरुआती ओपनसीएल संगत जीपीयू में मरने वाली स्मृति पर नहीं था, और स्थानीय मेमोरी सिर्फ एसडीआरएएम थी। न तो प्रति कोर है, और आप स्थानीय प्रभाव के लिए निजी और प्रति कार्य समूह के लिए प्रति कार्य आइटम का कितना उपयोग करते हैं, प्रति गणना इकाई चलाने वाले समवर्ती तरंगों की संख्या। – talonmies

उत्तर

4

जवाब टिप्पणियों में उपयोगकर्ता talonmies द्वारा दिया गया था, इसलिए मैं यहाँ एक नया उत्तर में यह लिखेंगे प्रश्न बंद हुआ।

ये मान एएमडी एपीपी ओपनसीएल प्रोग्रामिंग गाइड के परिशिष्ट डी में पाए जा सकते हैं http://developer.amd.com/sdks/amdappsdk/assets/amd_accelerated_parallel_processing_opencl_programming_guide.pdf (इसी तरह का दस्तावेज़ एनवीडिया के लिए मौजूद है)। स्पष्ट रूप से एक रजिस्टर एएमडी उपकरणों के लिए 128 बिट्स (4x32) है और सभी आधुनिक उच्च अंत उपकरणों के लिए 16384 रजिस्ट्रार हैं, इसलिए यह प्रति गणना इकाई के लिए उल्लेखनीय 256 केबी है।

0

मुझे लगता है कि आप __local स्मृति के लिए देख रहे हैं में here है। 32KB स्थानीय डेटा स्टोरेज का जिक्र है। मुझे नहीं लगता कि आप निजी स्मृति राशि प्राप्त करने के लिए डिवाइस को मतदान कर सकते हैं।

आप लंबे समय तक स्मृति को आबंटित करने * cl_mem संदर्भ एक शून्य में पारित कर सकते हैं। मुझे लगता है कि प्रति डब्ल्यूआई की एक स्थिर मात्रा में स्मृति का उपयोग करना सबसे अच्छा है। यह मानते हुए कि प्रत्येक कार्य आइटम के लिए लंबे [200] की आवश्यकता होगी, आप नीचे दिए गए कोड का उपयोग करेंगे। यह एलडीएस मेमोरी से अधिक लाभ प्राप्त करने के लिए, समान (या समान) स्मृति आवश्यकताओं वाले समूहों में काम को विभाजित करना भी एक अच्छा विचार होगा।

void __kernel(__local long* localMem, const int localMemPerItem 
     //more args... 
     ) 
{ 
    //host has 'passed' localMemPerItem*get_local_size() long values in as locamMem 
    //this work item has access to all of it, but can choose to restrict 
    //itself to only the portion it needs. 
    //work group size will be limited to CL_DEVICE_LOCAL_MEM_SIZE/(8*localMemPerItem) 
    int startIndex=localMemPerItem*get_local_id(0); 
    //use localMem[startIndex+ ... ] 
} 
+1

आप इसे मतदान नहीं कर सकते, लेकिन क्या यह अस्तित्व में है? प्रसिद्ध हर जगह देखा गया चित्र http://www.codeproject.com/KB/showcase/Memory-Spaces/image001.jpg मैंने माना कि प्रत्येक कार्य इकाई पर निजी रजिस्टरों का शारीरिक रूप से अलग सेट है। नहीं? मुझे किसी भी तरह से CL_DEVICE_LOCAL_MEM_SIZE/(8 * localMemPerItem) सीमा से बेहतर करने की उम्मीद है, क्योंकि यह मोटे तौर पर अप्रयुक्त कोर के आधे हिस्से को छोड़ देता है। ग्लोबल मेमोरी एक्सेस करना शायद बहुत धीमा होगा, भले ही यह केवल काउंटर को बढ़ा रहा हो। – user1111929

+1

मैं सरो, केमैन, और फर्मी रजिस्टर आकार यहाँ बारे में कुछ और जानकारी मिली: http://www.realworldtech.com/page.cfm?ArticleID=RWT121410213827&p=11 आपको लगता है कि आकार में कुछ सभ्य आकार निजी वार्स बदलाव करने में सक्षम होना चाहिए । मुझे लगता है कि एलडीएस अभी भी आपकी सबसे अच्छी शर्त होगी। – mfa

0

उत्तर देने के लिए कितनी बड़ी है, एक 79xx श्रृंखला कार्ड में फाइल रजिस्टर है, क्योंकि इसके GCN वास्तुकला पर आधारित यह 64KB छवि के अनुसार आनंदटेक में है: http://www.anandtech.com/print/5261

कैसे कैसे पता लगाने के लिए अपने सवाल का जवाब देने प्रत्येक कर्नेल का उपयोग करने वाली बहुत मेमोरी .. आप अपने कर्नेल पर एएमडी एपीपी प्रोफाइलर चला सकते हैं, यह आपको कर्नेल अधिभोग अनुभाग में बताता है कि कर्नेल द्वारा कितनी जगह का उपयोग किया जाता है।

+0

ओह सच में? वह अजीब है। मैंने जवाब पाया है, लेकिन यह एक अलग है। परिशिष्ट डी में एएमडी OpenCL प्रोग्रामिंग गाइड http://developer.amd.com/sdks/amdappsdk/assets/amd_accelerated_parallel_processing_opencl_programming_guide.pdf में, वहाँ कुल रजिस्टर फ़ाइल आकार है, और यह सभी आधुनिक उपकरणों के लिए 256 केबी के रूप में सूचीबद्ध है। अब कौन सा सही है? : एस – user1111929

+0

मेरा मानना ​​है कि दोनों सही हैं। जैसा कि मैं इसे समझता हूं, जीसीएन आर्किटेक्चर में, एक सिमड इकाई में 64kb रजिस्टर फ़ाइल होती है, और प्रति गणना इकाई 4 यानी सिम इकाइयां होती हैं, यानी। प्रति गणना इकाई कुल पंजीकरण फ़ाइल के 4 * 64kb = 256kb। – talonmies

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