1 पॉइंट द्वारा GN⁺ 2025-02-10 | 1 टिप्पणियां | WhatsApp पर शेयर करें

परिचय

  • यह लेख GPU में branching से जुड़ी गलत धारणाओं को ठीक करने के लिए है.
  • कुछ शैक्षिक वेबसाइटें गलत जानकारी फैला रही हैं, और उसे सुधारना ज़रूरी है.

समस्या

  • GPU code में conditional execution लागू करने के लिए ternary operator का उपयोग करने वाला code example दिया गया है.
  • कुछ लोग इसे arithmetic operations से बदलने वाली "optimization" का सुझाव देते हैं, लेकिन यह गलत समझ पर आधारित है.
  • ternary operator conditional move करता है, और यह सरल bit operations से implement होता है.
  • वास्तविक branching GPU code में होती है, लेकिन छोटे register moves के लिए इसका उपयोग नहीं किया जाता.

गलत optimization की समस्या

  • प्रस्तावित optimization वास्तव में मूल code से धीमी चलती है.
  • step() function ternary operator से implement होता है, इसलिए यह अनावश्यक multiplication और addition अतिरिक्त रूप से करता है.
  • मूल code में value को condition के आधार पर सीधे move किया जाता है.

machine code विश्लेषण

  • AMD और Microsoft compiler के machine code के माध्यम से यह पुष्टि की जा सकती है कि GPU branching नहीं करता.
  • comparison operations और bit masks का उपयोग करके conditional move किया जाता है.

निष्कर्ष

  • step() function का उपयोग करने वाला optimization सुझाव गलत जानकारी है, और इसे ठीक किया जाना चाहिए.

  • यह गलत जानकारी 20 साल से अधिक समय से फैल रही है, और इसे सुधारने की आवश्यकता है.

  • Inigo Quilez - 1994 से computer graphics सीख रहे हैं.

1 टिप्पणियां

 
GN⁺ 2025-02-10
Hacker News की राय
  • मुझे यक़ीन है कि TFA का निष्कर्ष सही है, लेकिन यदि सिर्फ बेहतर version ही नहीं बल्कि दोनों versions की code generation भी दी जाती, तो तर्क और मज़बूत होता

    • यह दिखाने के लिए generated machine code दिखाया गया है कि "optimized" version वास्तव में मूल version की तुलना में काफ़ी धीमा चलता है, लेकिन यह साबित नहीं करता कि ख़राब version उससे भी बदतर है
  • काश यह जानने का कोई अच्छा तरीका होता कि किन मामलों में if वास्तव में branch को मजबूर करता है

    • लोग ज़्यादा महंगे mix/lerps इसलिए इस्तेमाल करते हैं क्योंकि भले ही थोड़ा overhead हो, उन्हें branch बनने का डर रहता है
    • v = x > y ? a : b; का वास्तव में काम करना अच्छा है, लेकिन यह चिंता की बात है कि if कभी branch होता है और कभी नहीं
  • यह लेख भी संबंधित है: GPU में branch लिखने पर ग़लत सलाह को ठीक करना

    • पहले branch से बचने वाले optimization प्रभावी थे, लेकिन अब ऐसा नहीं करना चाहिए
    • processor और compiler बदलते रहते हैं, इसलिए कई variants देना और runtime पर सबसे तेज़ वाला चुनना बेहतर है
  • हैरानी है कि compiler यह क्यों नहीं पहचान पाता कि 'optimized' version समान है

    • उसे step() को समझना चाहिए और step()=0.0 तथा step()==1.0 के मामलों को अलग-अलग optimize कर पाना चाहिए
  • मैं इस समस्या में फँस चुका हूँ। Claude/ChatGPT भी इसे optimization के रूप में सुझाते हैं, लेकिन इससे performance गिरती है

    • Inigo का धन्यवाद
  • हैरानी है कि यह कैसे पता चले कि OpenGL function GPU की मूल functionality को call कर रहा है या उसकी emulation हो रही है

  • code लिखते समय इस भरोसे के लिए अनुभव चाहिए कि conditional branch नहीं बनेगी

    • यह जानना मुश्किल है कि condition के बाद कितनी operations branch पैदा कर सकती हैं, और compiler कौन-सी operations हटा सकता है
    • सोचता हूँ कि क्या accidental performance regression जाँचने के लिए performance test suite का उपयोग करना चाहिए
  • यह समझाता है कि mix function का variant vector पर कैसे काम करता है