সারসংক্ষেপ:
আমি গণনার দ্রুততম উপায় খুঁজছি
(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৪ বিট, জিসিসি এবং ক্লাঙ্গ এবং ম্যাকোস সহ।
y += !y
? এটি গণনা করার জন্য কোনও শাখার দরকার নেই। আপনি তুলনা পারে x / (y + !y)
বিরুদ্ধে x / max(y, 1)
এবং হয়ত এছাড়াও y ? (x/y) : 0
। আমার ধারণা কমপক্ষে অপ্টিমাইজেশন চালু থাকলে এগুলির কোনওটিতেই কোনও শাখা থাকবে না।
0
বিভাগগুলি বিশাল এবং সামঞ্জস্যপূর্ণ হলে আধুনিক দিনের শাখা পূর্বাভাস গ্রহণযোগ্য । সেখানে মাইক্রো অপ্টিমাইজেশন নিয়ে তুচ্ছ জন্য একটি জায়গা, এবং প্রতি-পিক্সেল অপারেশন হয় ঠিক যে জায়গা।