สรุป:
ฉันกำลังมองหาวิธีที่เร็วที่สุดในการคำนวณ
(int) x / (int) y
y==0
โดยไม่ได้รับข้อยกเว้นสำหรับ แต่ฉันแค่ต้องการผลลัพธ์ตามอำเภอใจ
พื้นหลัง:
เมื่อทำการเข้ารหัสอัลกอริทึมการประมวลผลภาพฉันมักจะต้องหารด้วยค่าอัลฟา (สะสม) ตัวแปรที่ง่ายที่สุดคือรหัส C ธรรมดาที่มีเลขคณิตจำนวนเต็ม ปัญหาของฉันคือฉันมักจะได้รับข้อผิดพลาดการหารด้วยศูนย์สำหรับพิกเซลผลลัพธ์ด้วย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% ว่าการแยกกิ่งนั้นแพงเกินไป อย่างไรก็ตามมีการใช้คอมไพเลอร์ที่แตกต่างกันดังนั้นฉันจึงชอบการเปรียบเทียบที่มีการปรับให้เหมาะสมเพียงเล็กน้อย (ซึ่งเป็นเรื่องที่น่าสงสัยอย่างยิ่ง)
แน่นอนว่าคอมไพเลอร์นั้นยอดเยี่ยมเมื่อพูดถึงการบิดเล็กน้อย แต่ฉันไม่สามารถแสดงผลลัพธ์ "ไม่สนใจ" ใน C ได้ดังนั้นคอมไพเลอร์จะไม่สามารถใช้การปรับให้เหมาะสมเต็มรูปแบบได้
โค้ดควรเข้ากันได้กับ C อย่างสมบูรณ์แพลตฟอร์มหลักคือ Linux 64 Bit พร้อม gcc & clang และ MacOS
y += !y
? ไม่จำเป็นต้องมีสาขาในการคำนวณ คุณสามารถเปรียบเทียบx / (y + !y)
กับและอาจจะยังx / max(y, 1)
y ? (x/y) : 0
ฉันเดาว่าจะไม่มีสาขาในทั้งสองอย่างอย่างน้อยก็เปิดการเพิ่มประสิทธิภาพไว้
0
ส่วนอัลฟ่ามีขนาดใหญ่และติดกัน มีสถานที่สำหรับเล่นซอรอบกับการเพิ่มประสิทธิภาพไมโครเป็นและต่อพิกเซลการดำเนินงานเป็นว่าสถานที่ที่