gpt4 book ai didi

c - 如何加速以下代码以显着计算 CPU 上的 LBP?

转载 作者:行者123 更新时间:2023-12-03 16:57:29 25 4
gpt4 key购买 nike

下面的代码在目标检测程序中被密集调用,花费了大约 80% 的执行时间。有什么办法可以显着加快速度吗?

#define CALC_SUM_(p0, p1, p2, p3, offset) ((p0)[offset] - (p1)[offset] - (p2)[offset] + (p3)[offset])
inline int calc_lbp2(float *p[], int offset)
{
int cval = CALC_SUM_( p[5], p[6], p[9], p[10], offset );

return (CALC_SUM_( p[0], p[1], p[4], p[5], offset ) >= cval ? 128 : 0) | // 0
(CALC_SUM_( p[1], p[2], p[5], p[6], offset ) >= cval ? 64 : 0) | // 1
(CALC_SUM_( p[2], p[3], p[6], p[7], offset ) >= cval ? 32 : 0) | // 2
(CALC_SUM_( p[6], p[7], p[10], p[11], offset ) >= cval ? 16 : 0) | // 5
(CALC_SUM_( p[10], p[11], p[14], p[15], offset ) >= cval ? 8 : 0)| // 8
(CALC_SUM_( p[9], p[10], p[13], p[14], offset ) >= cval ? 4 : 0)| // 7
(CALC_SUM_( p[8], p[9], p[12], p[13], offset ) >= cval ? 2 : 0)| // 6
(CALC_SUM_( p[4], p[5], p[8], p[9], offset ) >= cval ? 1 : 0);
}

我试过SSE,但是程序多耗了50ms左右(原来执行时间是170ms左右):

inline int calc_lbp_sse(float *p[], int offset)
{
static unsigned short bits[] = {0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001};
short c = CALC_SUM_( p[5], p[6], p[9], p[10], offset );
__m128i a = _mm_setr_epi16
(
CALC_SUM_( p[0], p[1], p[4], p[5], offset ),
CALC_SUM_( p[1], p[2], p[5], p[6], offset ),
CALC_SUM_( p[2], p[3], p[6], p[7], offset ),
CALC_SUM_( p[6], p[7], p[10], p[11], offset ),
CALC_SUM_( p[10], p[11], p[14], p[15], offset ),
CALC_SUM_( p[9], p[10], p[13], p[14], offset ),
CALC_SUM_( p[8], p[9], p[12], p[13], offset ),
CALC_SUM_( p[4], p[5], p[8], p[9], offset )
);
__m128i b = _mm_setr_epi16(c, c, c, c, c, c, c, c);

__m128i res = _mm_cmplt_epi16(b,a);
unsigned short* vals = (unsigned short*)&res;

return ((vals[0]&bits[0]) | (vals[1]&bits[1]) | (vals[2]&bits[2]) | (vals[3]&bits[3]) |
(vals[4]&bits[4]) | (vals[5]&bits[5]) |(vals[6]&bits[6]) |(vals[7]&bits[7]));
}

最佳答案

我在我的台式电脑上运行了你的函数 200000000 次,耗时 5.3 秒。然后我更改了这一行:

int cval = CALC_SUM_( p[5], p[6], p[9], p[10], offset );

为此:

float cval = CALC_SUM_( p[5], p[6], p[9], p[10], offset );

我重新运行相同的测试,现在用了 3.0 秒。现在我对 LBP 不熟悉,但看起来你并不是故意要将你的中心值转换为 int。根据我对 LBP 的了解,您只是将相邻值与中心值进行比较。但是,如果转换为 int 实际上很重要,那么请忽略此答案。

顺便说一句,我尝试了 japreiss 建议的替换 ? : 的方法。与 << 6 ,但无论哪种方式,我都获得了完全相同的速度。所以显然编译器已经优化了它(我正在使用 gcc -O3 )。

关于c - 如何加速以下代码以显着计算 CPU 上的 LBP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27370543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com