सारांश:
मैं गणना करने के लिए सबसे तेज़ तरीका ढूंढ रहा हूं
(int) x / (int) y
के लिए एक अपवाद प्राप्त किए बिना y==0
। इसके बजाय मैं सिर्फ एक मनमाना परिणाम चाहता हूं।
पृष्ठभूमि:
जब छवि प्रसंस्करण एल्गोरिदम कोडिंग मैं अक्सर एक (संचित) अल्फा मूल्य से विभाजित करने की जरूरत है। सबसे सरल संस्करण पूर्णांक अंकगणित के साथ सादा सी कोड है। मेरी समस्या यह है कि मुझे आमतौर पर परिणाम पिक्सेल के लिए शून्य त्रुटि से एक विभाजन मिलता है alpha==0
। हालाँकि यह बिल्कुल पिक्सेल हैं जहाँ परिणाम बिल्कुल भी मायने नहीं रखता है: मैं पिक्सेल के रंग मूल्यों के बारे में परवाह नहीं करता alpha==0
।
विवरण:
मैं कुछ इस तरह की तलाश में हूँ:
result = (y==0)? 0 : x/y;
या
result = x / MAX( y, 1 );
x और y धनात्मक पूर्णांक हैं। कोड को नेस्टेड लूप में कई बार निष्पादित किया जाता है, इसलिए मैं सशर्त ब्रांचिंग से छुटकारा पाने का एक तरीका ढूंढ रहा हूं।
जब y बाइट रेंज से अधिक नहीं है, तो मैं समाधान से खुश हूं
unsigned char kill_zero_table[256] = { 1, 1, 2, 3, 4, 5, 6, 7, [...] 255 };
[...]
result = x / kill_zero_table[y];
लेकिन यह स्पष्ट रूप से बड़ी रेंज के लिए अच्छी तरह से काम नहीं करता है।
मुझे लगता है कि अंतिम प्रश्न यह है: सबसे तेज़ बिट ट्विगलिंग हैक 0 को किसी अन्य पूर्णांक मान में बदल रहा है, जबकि अन्य सभी मूल्यों को अपरिवर्तित छोड़ रहा है?
स्पष्टीकरण
मुझे 100% यकीन नहीं है कि ब्रांचिंग बहुत महंगी है। हालांकि, विभिन्न संकलक का उपयोग किया जाता है, इसलिए मैं थोड़ा अनुकूलन (जो वास्तव में संदिग्ध है) के साथ बेंचमार्किंग पसंद करता हूं।
निश्चित रूप से, संकलक महान होते हैं जब बिट टिडलिंग की बात आती है, लेकिन मैं सी में "परवाह न करें" परिणाम व्यक्त नहीं कर सकता, इसलिए कंपाइलर कभी भी अनुकूलन की पूरी श्रृंखला का उपयोग करने में सक्षम नहीं होगा।
कोड पूरी तरह से सी संगत होना चाहिए, मुख्य प्लेटफॉर्म लिनक्स 64 बिट हैं gcc और क्लैंग और मैकओएस के साथ।
y += !y
? गणना करने के लिए किसी शाखा की आवश्यकता नहीं है। आप के x / (y + !y)
खिलाफ तुलना कर सकते हैं x / max(y, 1)
और शायद भी y ? (x/y) : 0
। मुझे लगता है कि उनमें से किसी में भी कोई शाखा नहीं होगी, कम से कम अनुकूलन के साथ चालू।
0
सेक्शन विशाल और सन्निहित हैं , तो आधुनिक दिन शाखा की भविष्यवाणी स्वीकार्य है । माइक्रो ऑप्टिमाइज़ेशन के साथ चारों ओर चक्कर लगाने के लिए एक जगह है, और प्रति-पिक्सेल ऑपरेशन ठीक उसी जगह है।