परिचय
- यह लेख 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 टिप्पणियां
Hacker News की राय
मुझे यक़ीन है कि TFA का निष्कर्ष सही है, लेकिन यदि सिर्फ बेहतर version ही नहीं बल्कि दोनों versions की code generation भी दी जाती, तो तर्क और मज़बूत होता
काश यह जानने का कोई अच्छा तरीका होता कि किन मामलों में if वास्तव में branch को मजबूर करता है
यह लेख भी संबंधित है: GPU में branch लिखने पर ग़लत सलाह को ठीक करना
हैरानी है कि compiler यह क्यों नहीं पहचान पाता कि 'optimized' version समान है
मैं इस समस्या में फँस चुका हूँ। Claude/ChatGPT भी इसे optimization के रूप में सुझाते हैं, लेकिन इससे performance गिरती है
हैरानी है कि यह कैसे पता चले कि OpenGL function GPU की मूल functionality को call कर रहा है या उसकी emulation हो रही है
code लिखते समय इस भरोसे के लिए अनुभव चाहिए कि conditional branch नहीं बनेगी
यह समझाता है कि mix function का variant vector पर कैसे काम करता है