जीपीयू पर लुकअप टेबल का उपयोग करते समय इष्टतम मेमोरी एक्सेस?


9

मैं एक स्नातक की परियोजना के लिए GPU पर isosurface एल्गोरिदम की खोज कर रहा हूं (विशेष रूप से वास्तविक-मूल्यवान क्षेत्रों के बजाय voxel डेटा में केवल बाइनरी पर ध्यान केंद्रित कर रहा हूं)। इसलिए मेरे पास अच्छे पुराने मार्चिंग क्यूब्स का एक सीपीयू कार्यान्वयन है और ओपनफ्रेमवर्क में चल रहा है, और अब इसे जीएसएसएल कम्प्यूट शेड्स में पोर्ट करने की कोशिश कर रहा है, और इससे पहले कि मैं गोता लगाऊं उसमें नुकसान पर विचार कर रहा हूं। मैंने केवल लंबवत और नाजुक शेडर्स लिखे हैं। इससे पहले यह सब मेरे लिए नया है।

मेरा पहला मुद्दा यह है कि एक कार्यसमूह में दर्जनों या सैकड़ों थ्रेड्स में कुशलतापूर्वक लुकअप टेबल का उपयोग कैसे किया जाए? मैं समझता हूं कि एक GPU में विभिन्न कार्यों के लिए विभिन्न प्रकार की मेमोरी होती है, लेकिन यह पूरी तरह से निश्चित नहीं है कि प्रत्येक कैसे संचालित होता है या किस प्रकार का उपयोग करना है।

पॉल बॉर्के की क्लासिक कॉपिस्टा टेबल एक 256 * 16 की सरणी है इसलिए यदि स्केलर बाइट प्रकार का उपयोग करके यह संभवत: 4kb बनावट या SSBO में पैक किया जा सकता है।

सवाल यह है कि विभिन्न धागों को एक-दूसरे को ट्रिप करने से कैसे रोका जाए? प्रत्येक कार्य समूह में कई क्यूब्स में संभवतः एक ही कॉन्फ़िगरेशन हो सकता है इसलिए एक ही समय में बफर में एक ही स्थान तक पहुंचने की कोशिश कर रहा है। क्या इससे निपटने के लिए वर्कअराउंड या ऑप्टिमाइज़ेशन है?


यदि यह केवल पढ़ने की मेज है, तो आप बस एक बफर / बनावट का उपयोग कर सकते हैं। आप इसे सामान्य बनावट स्वरूपों में से एक में पैक कर सकते हैं, या आप कस्टम प्रारूप के लिए DX11 / OpenGL की कुछ नई सुविधाओं का उपयोग कर सकते हैं। DX11 भूमि में UAV, या OpenGL भूमि में एक बनावट / shader_image_load_store।
रिचीसेम्स

इसके अलावा, इस प्रस्तुति को एक रूप दें: cvg.ethz.ch/teaching/2011spring/gpgpu/cuda_memory.pdf यह CUDA के लिए है, लेकिन इससे आपको बेहतर अंदाजा हो सकता है कि अंतर्निहित हार्डवेयर पर क्या हो रहा है
RichieSams

एक पूर्ण उत्तर नहीं है लेकिन जितनी छोटी मेमोरी आप बेहतर उपयोग करते हैं, क्योंकि यह कैश में फिट होने की अधिक संभावना है और कम कैश मिसेज है। यदि आपके पास प्रक्षेप्य मूल्य हैं, जैसे आप बनावट में वक्र पर बिंदुओं को पका रहे हैं, तो आप इसे कम स्मृति के साथ उच्च गुणवत्ता वाले वक्र लुकअप तालिकाओं को प्राप्त करने के तरीके के रूप में देख सकते हैं: blog.demofox.org/2016/02/22/…
एलन वोल्फ

जवाबों:


6

GPU कम्प्यूट शेडर के लिए एक लुक अप टेबल रखने के लिए सबसे अच्छी जगह लुकअप टेबल के आकार और एक्सेस की आवृत्ति / सुसंगतता पर निर्भर करती है। आपके मामले में (आपने 4kb का उल्लेख किया है), साझा की गई स्थानीय मेमोरी संभवतः सबसे अच्छी होगी (यह मानते हुए कि आपको उसी कर्नेल में अन्य उद्देश्यों के लिए इस मेमोरी की आवश्यकता नहीं है)। इस मेमोरी के अलग-अलग एपीआई में अलग-अलग नाम हैं, लेकिन यह एक ही वास्तुशिल्प चीज है और समान प्रदर्शन दिशानिर्देशों का पालन करती है:

  • CUDA: थ्रेडग्रुप साझा की गई मेमोरी
  • DirectCompute: समूहीकृत मेमोरी
  • ओपनसीएल: स्थानीय मेमोरी
  • धातु: थ्रेडग्रुप मेमोरी
  • ओपनजीएल: साझा की गई मेमोरी

वैश्विक मेमोरी में लुकअप टेबल को केवल-पढ़ने के लिए बफर के रूप में संग्रहीत करना, आपके द्वारा चलाए जा रहे विशेष GPU के कैश आकार (नों) पर निर्भर करता है।

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


ऐसे मामले भी हैं जहां एक रीड-ओनली बफर साझा स्थानीय मेमोरी में रीड-ओनली डेटा के 4kb स्टोर करने से बेहतर होगा। उदाहरण के लिए, इसे स्थानीय मेमोरी में संग्रहीत करने का मतलब यह हो सकता है कि हर थ्रेड समूह के लिए आपके डेटा की एक अद्वितीय प्रतिलिपि है। यदि बफर कैश में फिट बैठता है, तो यह बहुत संभव है कि कैश केवल-पढ़ने के लिए एक्सेस पैटर्न के लिए स्थानीय मेमोरी से बेहतर प्रदर्शन करे।
जॉन कैल्सबेक

राय देने के लिए आप सभी का धन्यवाद। मैंने उस परियोजना को समाप्त कर दिया है जिसे मैं अभी के लिए उपयोग कर रहा था, और एक r8ui आसानी से बफर बनावट का उपयोग करके घाव कर रहा हूं, जो बहुत अच्छी तरह से काम करता है :)
russ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.