2016-11-09 10 views
6

जीपीयू का उपयोग करते हुए विंडोज़ पर लंबे ओपनसीएल कंप्यूटेशंस चलाते समय जो मुख्य डिस्प्ले चलाता है, ओएस Timeout Detection and Recovery के साथ गणना को बाधित कर सकता है।ओपनसीएल: टीडीआर से गणना गणना विफलता

मेरे अनुभव में (जावा, एनवीडिया जीपीयू के साथ, नेटिवलिब्स 4 जावा द्वारा जावासीएल का उपयोग करके) यह "आउट ऑफ़ रिसोर्सेज" (cl_out_of_resources) त्रुटि के रूप में प्रकट होता है जब ivoking clEnqueueReadBuffer।

समस्या यह है कि मुझे एक ही संदेश मिलता है जब ओपनसीएल प्रोग्राम अन्य कारणों से (उदा।, अवैध स्मृति तक पहुंचने के कारण)।

क्या टीडीआर के कारण "संसाधनों से बाहर" और अन्य समस्याओं के कारण "संसाधन से बाहर" के बीच अंतर करने के लिए एक (अर्ध) विश्वसनीय तरीका है?

वैकल्पिक रूप से, क्या मैं कम से कम विश्वसनीय रूप से (जावा/ओपनसीएल एपीआई के माध्यम से) निर्धारित कर सकता हूं कि गणना के लिए उपयोग किया जाने वाला जीपीयू भी प्रदर्शन चला रहा है?

मुझे this question के बारे में पता है, हालांकि, क्लफिनिश वापस नहीं आने पर इसका जवाब परिदृश्यों से संबंधित है, जो मेरे लिए कोई समस्या नहीं है (मेरा कोड अब तक ओपनसीएल एपीआई के भीतर जमे हुए नहीं है)।

उत्तर

2

वहाँ एक (अर्ध) विश्वसनीय के बीच भेद करने तरीका है टीडीआर की वजह से और एक "संसाधनों से बाहर" अन्य समस्याओं के कारण " संसाधनों से बाहर" एक?

1)

आप WMI से

KeyPath : 
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GraphicsDrivers 
KeyValue : TdrDelay ValueType : REG_DWORD ValueData : Number of 
seconds to delay. 2 seconds is the default value. 

का उपयोग

KeyPath : HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GraphicsDrivers 
KeyValue : TdrLimitCount 
ValueType : REG_DWORD 
ValueData : Number of TDRs before crashing. The default value is 5. 
से गुणा करने के लिए कर सकते हैं

फिर से डब्लूएमआई के साथ। जब आप इन्हें गुणा करते हैं तो आपको 10 सेकंड मिलते हैं। और, यदि आप मिलना चाहिए

KeyPath : 
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GraphicsDrivers 
KeyValue : TdrLimitTime ValueType : REG_DWORD ValueData : Number of 
seconds before crashing. 60 seconds is the default value. 

कि WMI से 60 सेकंड पढ़ना चाहिए।

इस उदाहरण कंप्यूटर के लिए, यह 5 x 2-सेकंड + 1 60 सेकंड की सीमा के क्रैश होने का अंतिम से पहले अतिरिक्त देरी लेता है। फिर यदि आप अंतिम स्टॉपवॉच काउंटर उन सीमाओं से अधिक हो तो आप आवेदन से जांच सकते हैं। यदि हां, शायद यह टीडीआर है। वहाँ भी एक धागा निकास-से-चालक इन के शीर्ष पर समय सीमा नहीं है,

KeyPath : 
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GraphicsDrivers 
KeyValue : TdrDdiDelay ValueType : REG_DWORD ValueData : Number of 
seconds to leave the driver. 5 seconds is the default value. 

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

2)

तुम बहुत छोटे भागों में कुल काम को अलग। यदि डेटा अलग नहीं है, तो इसे एक बार कॉपी करें, फिर लंबे समय से चलने वाले कर्नेल को बहुत कम-श्रेणी वाले कर्नेल एन बार के रूप में किसी भी दो के बीच प्रतीक्षा करने के साथ शुरू करें।

फिर, आपको यह सुनिश्चित करना होगा कि टीडीआर को हटा दिया गया है। यदि यह संस्करण चलता है लेकिन लंबे समय से चलने वाले कर्नेल नहीं करता है, तो यह टीडीआर गलती है। अगर यह विपरीत है, तो यह स्मृति दुर्घटना है। इस तरह दिखता है:

short running x 1024 times 
long running 
long running <---- fail? TDR! because memory would crash short ver. too! 
long running 

एक और कोशिश:

short running x 1024 times <---- fail? memory! because only 1ms per kernel 
long running 
long running 
long running 

वैकल्पिक रूप से, मैं कम से कम मज़बूती से (जावा में/OpenCL एपीआई के माध्यम से) निर्धारित कर सकते हैं गणना के लिए इस्तेमाल किया GPU है कि प्रदर्शन भी चला रहा है?

1)

दोनों उपकरणों का प्रयोग अंतर गुण:

// taken from Intel's site: 
std::vector<cl_device_id> devs (devNum); 
//reading the info 
clGetGLContextInfoKHR(props, CL_DEVICES_FOR_GL_CONTEXT_KHR, bytes, devs, NULL)) 

इस अंतर-संचालित उपकरणों की सूची देता है। यदि आप इसका उपयोग नहीं करना चाहते हैं तो आपको इसे बाहर करने के लिए अपनी आईडी प्राप्त करनी चाहिए।

2)

एक और धागा GPUs व्यस्त में से एक रखने के लिए कुछ OpenGL या DirectX स्थिर वस्तु ड्राइंग कोड चलाने है। फिर कुछ छोटे ओपनक्ल कर्नेल कोड के लिए एक और थ्रेड का उपयोग करके सभी जीपीयस का परीक्षण करें। टेस्ट:

  • ओपनजीएल उच्च त्रिभुज गिनती @ 60 एफपीएस के साथ कुछ खींचना शुरू करता है। कुछ समय के बाद 40 keps
  • , ओपन बंद करो और अपने विंडो बंद (यदि पहले से ही नहीं)
  • : 30 keps
  • डिवाइस 2:
  • OpenCL गणना के लिए शुरू उपकरणों प्रति सेकंड
  • डिवाइस 1 औसत गिरी फांसी मिल
  • डिवाइस 1: 75 केप -----> प्रतिशत में उच्चतम वृद्धि! -> प्रदर्शन !!!
  • डिवाइस 2: 41 keps ----> नहीं के रूप में उच्च वृद्धि, लेकिन यह

आप उपकरणों के बीच किसी भी डेटा नकल नहीं करनी चाहिए कर सकते हैं कर रहे हैं, जबकि यह तो सीपीयू/रैम टोंटी नहीं होगा।

3)

तो डेटा वियोज्य है, तो आप एक विभाजन और जीत एल्गोरिथ्म किसी भी GPU का अपना काम मिल ही जब यह उपलब्ध है दे दो और प्रदर्शन हिस्सा अधिक लचीलापन (क्योंकि यह प्रदर्शन है का उपयोग कर सकते -aware समाधान और कम से चल संस्करण लेकिन समय-निर्धारण के लिए इसी तरह कई GPUs पर किया जाता है)

4)

मैं जांच नहीं की क्योंकि मैं अपने 2 GPU को बेच दिया लेकिन, आप

CL_DEVICE_TYPE_DEFAULT 
प्रयास करना चाहिए हो सकता है

आपके बहु-जीपीयू सिस्टम में यह जांचने के लिए कि क्या यह जीपीयू प्रदर्शित करता है या नहीं। पीसी बंद करें, अन्य कार्ड पर प्लग मॉनिटर केबल, पुनः प्रयास करें। बंद करो, कार्ड की सीटें बदलें, पुनः प्रयास करें। बंद करो, कार्डों में से एक को हटा दें ताकि केवल 1 जीपीयू और 1 सीपीयू छोड़ा जा सके, फिर से प्रयास करें। यदि ये सभी केवल जीपीयू प्रदर्शित करते हैं तो यह डिस्प्ले जीपीयू को डिफॉल्ट के रूप में चिह्नित करना चाहिए।

+0

व्यापक उत्तर के लिए धन्यवाद। मैं ध्यान देना चाहूंगा कि रजिस्ट्री मानों में से केवल TdrDelay आवश्यक है, क्योंकि कर्नेल को 2 सेकंड के बाद समाप्त कर दिया गया है। अन्य नियम मूल्य AFAIK को विनियमित करते हैं कि यदि आवेदन कई बार बंद हो जाता है तो क्या करना है। रजिस्ट्री को संशोधित करना या दूसरे भाग के विकल्प 2 + 3 शायद व्यावहारिक नहीं हैं, क्योंकि कोड क्लाइंट मशीन पर चलाएगा। फिर भी, मुझे लगता है कि कम से कम एक समाधान मेरे मामले में काम कर सकता है। –

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