2010-10-01 9 views
79

मैं सीयूडीए और ओपनसीएल के लिए प्रोग्रामिंग गाइड पढ़ रहा हूं, और मैं यह नहीं समझ सकता कि बैंक संघर्ष क्या है। वे इस विषय पर विस्तार किए बिना समस्या को हल करने के तरीके में गोता लगाने की तरह हैं। क्या कोई मुझे समझने में मदद कर सकता है? अगर सीयूडीए/ओपनसीएल के संदर्भ में या कंप्यूटर विज्ञान में सामान्य रूप से बैंक संघर्षों के संदर्भ में सहायता की कोई प्राथमिकता नहीं है।बैंक संघर्ष क्या है? (कुडा/ओपनसीएल प्रोग्रामिंग करना)

+0

[CUDA "बैंक संघर्ष"] googling के बजाय का प्रयास करें। – belwood

उत्तर

86

nvidia (और उस मामले के लिए amd) के लिए gpus स्थानीय स्मृति मेमोरीबैंक में बांटा गया है। प्रत्येक बैंक एक समय में केवल एक डेटासेट को संबोधित कर सकता है, इसलिए यदि कोई अर्धवाही उसी बैंक से डेटा लोड/स्टोर करने का प्रयास करता है तो पहुंच को क्रमबद्ध करना होगा (यह एक बैंक संघर्ष है)। Gt200 gpus के लिए 16 बैंक (फर्मि के लिए 32 टैंक), एएमडी जीपीयस के लिए 16 या 32 बैंक (57xx या उच्चतम: 32, नीचे सब कुछ: 16)) हैं, जो 32 बिट की ग्रैन्युइटी के साथ जुड़े हुए हैं (इसलिए बाइट 0-3 में हैं बैंक 1, 4-7 2 बैंक में, ..., 64-69 बैंक 1 और इसी तरह)। एक बेहतर दृश्य के लिए यह मूल रूप से इस तरह दिखता है:

Bank |  1  |  2  |  3  |... 
Address | 0 1 2 3 | 4 5 6 7 | 8 9 10 11 |... 
Address | 64 65 66 67 | 68 69 70 71 | 72 73 74 75 |... 
... 

तो अगर एक halfwarp में प्रत्येक थ्रेड तक पहुँचता लगातार 32 बिट मूल्यों कोई बैंक संघर्ष कर रहे हैं। इस नियम से एक अपवाद (प्रत्येक धागे को अपने बैंक तक पहुंचना चाहिए) प्रसारण हैं: यदि सभी धागे एक ही पते तक पहुंचते हैं, तो मान केवल एक बार पढ़ा जाता है और सभी धागे पर प्रसारित किया जाता है (जीटी 200 के लिए इसे अर्धवार्प एक्सेसिंग में सभी धागे होना चाहिए एक ही पता, आईआईआरसी फर्मि और एएमडी जीपीस एक ही मूल्य तक पहुंचने वाले किसी भी धागे के लिए ऐसा कर सकते हैं)।

+3

दृश्य और स्पष्टीकरण के लिए मीठे धन्यवाद। मुझे प्रसारण के बारे में पता नहीं था और यह एक महत्वपूर्ण जानकारी की तरह लगता है :) मैं यह सत्यापित करने के बारे में कैसे जाऊं कि मेरे भार और स्टोर साझा स्मृति में बैंक विवादों का कारण नहीं बनते हैं? क्या मुझे किसी भी तरह असेंबली कोड पर जाना है या अन्य तरीके हैं? – smuggledPancakes

+3

बैंक संघर्ष के अवसर के बाद somethink है जो रनटाइम पर निर्धारित किया जाएगा (जिसका मतलब है कि कंपाइलर इसके बारे में नहीं जानता है, सभी ज्यादातर पते रनटाइम पर उत्पन्न होते हैं), संकलित संस्करण प्राप्त करने से ज्यादा मदद नहीं मिलती है। मैं आम तौर पर इसे पुराने पुराने तरीके से करता हूं, मेनिंग मैं पेन और पेपर लेता हूं और सोचता हूं कि मेरा कोड कहां स्टोर करता है। बाद में बैंक संघर्ष के अवसर को नियंत्रित करने वाले नियम जटिल नहीं हैं। अन्यथा आप एनवीडिया ओपनसीएल प्रोफाइलर का उपयोग कर सकते हैं (एसडीके, आईआईआरसी के साथ बंडल किया जाना चाहिए)। मुझे लगता है कि यह warp serializes के लिए एक काउंटर है। – Grizzly

+1

वार serializes इंगित करने के लिए धन्यवाद। कम्प्यूट प्रोफाइलर के साथ आने वाली रीडेमे टेक्स्ट फाइलों में से एक ने कहा, – smuggledPancakes

11

साझा स्मृति जिसे समानांतर में उपयोग किया जा सकता है उसे मॉड्यूल (जिसे बैंक भी कहा जाता है) में विभाजित किया जाता है। यदि एक ही बैंक में दो मेमोरी स्थान (पते) होते हैं, तो आपको बैंक संघर्ष मिलता है जिसके दौरान समानांतर पहुंच के फायदे खोने पर पहुंच को क्रमशः किया जाता है।

+0

तो क्या यह संबंधित है जब आधा-वार स्मृति को स्टोर या लोड करना चाहता है? 16 धागे मेमोरी लेनदेन करने की कोशिश कर रहे हैं और इस प्रकार एक से अधिक थ्रेड वाले एक ही बैंक तक पहुंचने से सीरियलाइज्ड प्रसंस्करण होता है? इसके अलावा, कोई यह सुनिश्चित करता है कि आप उसी बैंक में डेटा संग्रहित/लोड नहीं कर रहे हैं? – smuggledPancakes

5

सरल शब्दों में, बैंक संघर्ष एक ऐसा मामला है जब मेमोरी सिस्टम में उपलब्ध बैंकों में आईओ वितरित करने में कोई मेमोरी एक्सेस पैटर्न विफल रहता है। निम्नलिखित उदाहरण अवधारणा को विस्तृत करते हैं: -

मान लीजिए कि हमारे पास दो आयामी 512x512 सरणी पूर्णांक हैं और हमारे डीआरएएम या मेमोरी सिस्टम में 512 बैंक हैं। डिफ़ॉल्ट रूप से सरणी डेटा इस तरह से लेआउट होगा कि एआर [0] [0] बैंक 0 पर जाता है, एआर [0] [1] बैंक 1, एआर [0] [2] बैंक 2 में जाता है .... एआर [0] [511] बैंक 511 में जाता है। सरणी को सामान्य करने के लिए [x] [y] बैंक नंबर वाई पर कब्जा करता है। अब कुछ कोड (जैसा कि नीचे दिखाया गया है) कॉलम प्रमुख फैशन यानी डेटा में डेटा एक्सेस करना प्रारंभ करें। वाई स्थिर रखते हुए एक्स बदलना, फिर अंतिम परिणाम यह होगा कि सभी मेमोरी एक्सेस उसी बैंक पर आ जाएंगे - इसलिए बैंक संघर्ष।

int arr[512][512]; 
    for (j = 0; j < 512; j++) // outer loop 
    for (i = 0; i < 512; i++) // inner loop 
     arr[i][j] = 2 * arr[i][j]; // column major processing 

इस तरह की समस्याएं हैं, आमतौर पर, सरणी बफरिंग या सरणी में तत्वों की अभाज्य संख्या का उपयोग करके compilers से बचा रहे हैं।

1

http://en.wikipedia.org/wiki/Memory_bank
और http://mprc.pku.cn/mentors/training/ISCAreading/1989/p380-weiss/p380-weiss.pdf

इस पेज से

, आप स्मृति बैंक के बारे में विस्तार पा सकते हैं। लेकिन यह @Grizzly द्वारा क्या कहा जाता है उससे थोड़ा अलग है। इस पेज में , बैंक इस

बैंक की तरह है 1 2 3

पता | 0, 3, 6 ... | | 1, 4, 7 ... | | 2, 5,8 ... |

आशा है कि यह मदद मिलेगी

2

(CUDA बैंक संघर्ष) मुझे आशा है कि यह मदद मिलेगी .. यह बहुत अच्छा explaination है ...

http://www.youtube.com/watch?v=CZgM3DEBplE

+0

ध्यान दें कि [केवल-लिंक उत्तर] (http://meta.stackoverflow.com/tags/link-only-answers/info) निराश हैं, SO उत्तर समाधान के लिए खोज का अंत बिंदु होना चाहिए (बनाम। फिर भी संदर्भों का एक और स्टॉपओवर, जो समय के साथ पुराना हो जाता है)। लिंक को संदर्भ के रूप में रखते हुए, यहां स्टैंड-अलोन सारांश जोड़ना पर विचार करें। – kleopatra

+0

ओपी की बेहतर सहायता के लिए कृपया लिंक पर विस्तार से विस्तृत करें। –

+0

यह वीडियो वास्तव में उपयोगी है! और मुझे नहीं पता कि नीचे वोट क्यों! यह एक बहुत अच्छा इनपुट है! +1 – Gabriel

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