摘要:
我正在寻找最快的计算方法
(int) x / (int) y
毫无例外的y==0
。相反,我只想要一个任意结果。
背景:
在对图像处理算法进行编码时,我经常需要除以(累积的)alpha值。最简单的变体是带有整数算术的纯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];
但这显然不适用于较大范围。
我猜最后一个问题是:将hack更改0到任何其他整数值,同时保持所有其他值不变的最快方法是什么?
澄清说明
我不是100%确信分支成本太高。但是,由于使用了不同的编译器,因此我更喜欢基准测试并没有进行任何优化(这确实是有问题的)。
可以肯定的是,编译器在处理纠结方面非常出色,但是我无法在C语言中表达“无关紧要”的结果,因此编译器将永远无法使用全部优化。
代码应完全与C兼容,主要平台是带有gcc和clang的Linux 64位以及MacOS。
y += !y
?无需分支即可进行计算。你可以比较x / (y + !y)
反对x / max(y, 1)
,也许还y ? (x/y) : 0
。我想至少在启用优化的情况下,它们两个都不会分支。
0
部分很大且连续,则可以接受现代分支预测。有一个摆弄微优化的地方,而每个像素的操作正是那个地方。