2012-02-25 19 views
13

मैं आज सुबह एक रहस्यमय बग लग रहा था कि मुझे बहुत भाग्यशाली लगता है कि वह बहुत जल्दी समाधान के लिए ठोकर खा रहा है।ओपनजीएल शेडर्स में NaN के पता लगाने का सबसे अच्छा तरीका

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

मिश्रण के दौरान, एनवीडिया स्वीकार्य रूप से NaN को 0 मान के रूप में मानता है, लेकिन इंटेल नाक को कैस्केड नहीं करता है और जिसके परिणामस्वरूप काले टुकड़े होते हैं।

और इसलिए यह बग तब तक जारी रहा जब तक कि मैंने इंटेल मशीन पर कोड का परीक्षण नहीं किया।

मुझे आश्चर्य है कि क्या कुछ ऐसा है जो मैं अवैध मूल्यों को "जाल" करने के लिए कर सकता हूं। ऐसा लगता है कि, नियमित प्रोग्रामिंग के रूप में, केवल एकमात्र निश्चित (और फिर भी यह बुलेटप्रूफ महसूस नहीं करता) इस से निपटने का तरीका है संख्याओं को विभाजित करते समय सभी संभावित मामलों पर ध्यान से विचार करना।

NaN का पता लगाने का मानक तरीका यह देखने के लिए है कि कोई संख्या स्वयं के बराबर नहीं है या नहीं। क्या मैं शायद एक डीबग शेडर का निर्माण कर सकता हूं जो यह देखने के लिए प्रत्येक खंड को जांचता है कि यह स्वयं के बराबर नहीं है, और यदि वह स्थिति पूरी हो जाती है, तो चमकती, विशिष्ट रंग सेट करें? क्या जीएलएसएल मुझे इस तरह एक नाएन का पता लगाने की इजाजत देता है या जब भी कोई मान अमान्य होता है तो मैं अपरिभाषित व्यवहार से फंस जाता हूं?

+0

आप 0 से विभाजित क्यों करते हैं? क्या आप काउंटर 0 को पकड़ नहीं सकते हैं या अपना एल्गोरिदम बदल सकते हैं? – djmj

+2

प्रोग्रामर के लिए हमेशा यह जांचना उचित होता है कि एक संभावित संप्रदाय शून्य हो सकता है लेकिन जांच प्रदर्शन लागत लग सकती है। मेरा सवाल तथ्य के बाद खराब मूल्यों की पहचान से संबंधित है। –

उत्तर

16

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

यह काम नहीं करता है कि यह कैसे काम करता है। जब आप शून्य से विभाजित होते हैं, तो आपको INF मिलता है, नाएन नहीं। जब तक संख्यात्मक शून्य भी न हो, तब तक आपको नाएन मिल जाए।

किसी भी मामले में, जीएलएसएल isinf और isnan फ़ंक्शंस प्रदान करता है, जो वे कहते हैं।

+0

आह। यह बहुत सुविधाजनक है। बाहर निकलता है कि वे NaN थे क्योंकि denominator था, तो संख्या हमेशा शून्य होगा। –

3

आईएसएनएल और ओपनगल ईएस 2.0 के लिए इस्नान की कमी समस्या है। पॉलीफिल जो सभी जीपीयू के लिए काम करता है, मुझे कोशिश करने का अवसर मिला:

bool isnan(float val) 
{ 
    return (val < 0.0 || 0.0 < val || val == 0.0) ? false : true; 
    // important: some nVidias failed to cope with version below. 
    // Probably wrong optimization. 
    /*return (val <= 0.0 || 0.0 <= val) ? false : true;*/ 
} 
+1

[ओपनजीएल ईएस जीएलएसएल 3+ में 'इस्नान' है] (https://www.khronos.org/opengles/sdk/docs/man31/)। –

+1

महान जानकारी, धन्यवाद दोस्तों –

+1

एनवीआईडीआईए इसके बहुत आक्रामक अनुकूलक के कारण इसका सामना करने में विफल रहता है। – Ruslan

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

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