【发布时间】:2011-05-04 12:27:53
【问题描述】:
我有一个简单的C函数如下:
unsigned char clamp(short value){
if (value < 0) return 0;
if (value > 0xff) return 0xff;
return value;
}
是否可以在不使用任何 if / else 分支的情况下重写它,同时提高效率?
编辑:
我基本上希望看看是否可以进行一些基于位算术的钳位实现。目标是在 GPU(图形处理单元)上处理图像。这种类型的代码将在每个像素上运行。我想如果可以避免分支,那么 GPU 的整体吞吐量会更高。
像 (value 255) ? 255 : value) ) 这样的解决方案只是使用语法糖对 if/else 分支进行重新散列。所以我不是在寻找它。
编辑 2:
如果如下,我可以将其缩减为单个,但我无法更好地思考:
unsigned char clamp(short value){
int more = value >> 8;
if(more){
int sign = !(more >> 7);
return sign * 0xff;
}
return value;
}
编辑 3:
刚刚在 FFmpeg 代码中看到了一个非常好的实现:
/**
* Clip a signed integer value into the 0-255 range.
* @param a value to clip
* @return clipped value
*/
static av_always_inline av_const uint8_t av_clip_uint8_c(int a)
{
if (a&(~0xFF)) return (-a)>>31;
else return a;
}
这当然有效,如果很好的话,它可以减少到一个。
【问题讨论】:
-
只是对术语的快速说明,我相信这通常被称为钳位,而不是剪裁,如果它与计算相关联,它通常被称为“饱和算术”,如果你在谷歌搜索。
-
您为什么要这样做?这看起来已经很有效了。
-
GPU 上有
abs()吗? -
@roe,我已经更新了术语。谢谢。
-
不确定这是否是您的意图,但 FFmpeg 的最后一个示例看起来像是进行了换行。所以 256 变成 -1
标签: c